Intereting Posts
Какие пакеты следует установить для подключения Fedora 21 к Интернету с помощью телефона Android? top / htop; групповой процесс по команде включение ECMP в Linux У Apache нет разрешения на копирование файлов из смонтированного каталога Клавиатура и мышь не работают после случайного удаления xorg.conf.d Почему ошибки OS X `install` на перенаправленном входе, когда одна и та же версия` install` на linux работает нормально? Как определить, является ли вывод команды или сценария оболочки стандартным или stderr Поиск значений в 2 столбцах из CSV Не удается подключиться к локальному серверу MySQL. Как использовать команды в файлах, начинающиеся с «-» Создавать папки из определенных частей строк в текстовом файле VLC в фоновом режиме и отображать его только через HDMI изменять размеры значков в приложениях Gtk + 3 использование gpg-агента между разными сеансами Получите среднесуточные значения от sar

Сценарий bash для взятия двух строк в текстовом файле и формирования столбцов вдоль одной строки

Я только начинаю в bash, чтобы облегчить работу для стажировки. Поэтому я не очень хорош и сожалею заранее, если моя первоначальная попытка настолько не важна, что это не поможет. Пожалуйста, не стесняйтесь просить разъяснений.

Мой ввод напоминает:

Set1 1 2 3 4 Set2 5 6 7 8 

Я бы хотел, чтобы мой результат был следующим:

 group1 1 5 group1 2 6 group2 3 7 group2 4 8 

Так что я мог бы сделать

 A=$(sed -n '2p' input) B=$(sed -n '7p' input) printf "group1\t$A\t$B" >> output 

и повторите это еще 3 раза.

Проблема в том, что вместо 2 групп по 4 числа каждый, у меня на самом деле есть 7 групп по 34 числа каждый, поэтому примерно 200-300 баллов. Вот почему я хотел бы создать скрипт, который будет автоматизировать эту задачу.

Для первых 17 номеров (группа 1) у меня было:

 #!/bin/bash ############################################################################## #group1 for (( i=0; i<=16; i++ )) ; do A=$(echo "scale=1;x=2+$i; x" |bc -l) B=$(echo "scale=1;x=128+$i; x" |bc -l) C=$(sed -n "$Ap" input) D=$(sed -n "$Bp" input) printf "group1\t$C\t$D\n" >> output done 

Конечно, это не работает вообще, возможно, по многим причинам. Во-первых, я фактически не смог использовать sed для фильтрации определенной строки, используя переменную, как вход для номера строки. Это моя текущая ошибка, но я подозреваю, что будет больше этого. Я более чем открыт для других подходов.

  • Есть ли автоматизированный способ ввода двух номеров строк в качестве входных данных и размещения их в столбцах по одной строке?
  • Есть ли автоматизированный способ сделать эту единственную строку начатой ​​с другого столбца, например. group1 / group1 / group2 / group2?

Спасибо за любой совет.

Если вы хотите что-то быстро 'грязное, чтобы просто коллизировать данные, вы можете попробовать pr

 pr -t -2 input Set1 Set2 1 5 2 6 3 7 4 8 pr -t -7 input17x7 Set1 Set2 Set1 Set2 Set1 Set2 Set1 1 a 1 a 1 a 1 2 b 2 b 2 b 2 3 c 3 c 3 c 3 4 d 4 d 4 d 4 5 e 5 e 5 e 5 6 f 6 f 6 f 6 7 g 7 g 7 g 7 8 h 8 h 8 h 8 9 i 9 i 9 i 9 10 j 10 j 10 j 10 11 k 11 k 11 k 11 12 l 12 l 12 l 12 13 m 13 m 13 m 13 14 n 14 n 14 n 14 15 o 15 o 15 o 15 16 p 16 p 16 p 16 17 q 17 q 17 q 17 

Для лучшего контроля есть утилита rs . Например, вы можете:

 { printf 'Group\n' ; printf 'group%d\n' {1..17} ; cat input17x7; } | rs -et 18 8 Group Set1 Set2 Set1 Set2 Set1 Set2 Set1 group1 1 a 1 a 1 a 1 group2 2 b 2 b 2 b 2 group3 3 c 3 c 3 c 3 group4 4 d 4 d 4 d 4 group5 5 e 5 e 5 e 5 group6 6 f 6 f 6 f 6 group7 7 g 7 g 7 g 7 group8 8 h 8 h 8 h 8 group9 9 i 9 i 9 i 9 group10 10 j 10 j 10 j 10 group11 11 k 11 k 11 k 11 group12 12 l 12 l 12 l 12 group13 13 m 13 m 13 m 13 group14 14 n 14 n 14 n 14 group15 15 o 15 o 15 o 15 group16 16 p 16 p 16 p 16 group17 17 q 17 q 17 q 17 

Если вы не хотите заголовок, проведите результат через tail -n +2