Преобразовать ввод на основе строк в столбец на основе Shell
-
27-10-2019 - |
Вопрос
Мне нужна ваша помощь при вводе нескольких строк в разные столбцы. И сделать то же самое со всеми записями в файле.
Пример файла (показывая только 2 записи, есть много подобных):
>ABC
*
AGA-AUUCUC-CGGUUCAAUCU
|||
UCUAUAACCGCGCCGAGUUAGU
>ABC
*
AGAUAU-GCUGCAGGCUCAAUUG
||||||
UCUAUAACCGCG-CCGAGUUAGU
Формат файла требуется:
>ABC AGA-AUUCUC-CGGUUCAAUCU UCUAUAACCGCGCCGAGUUAGU
>ABC AGAUAU-GCUGCAGGCUCAAUUG UCUAUAACCGCG-CCGAGUUAGU
Я могу преобразовать отдельный вход в требуемый формат по:
tr '\n' '\t' <test3 | awk '{print $1,$3,$5}'
Но как мне сделать это со всеми записями, прочитав весь файл?
Решение
Я думаю, что вы были на правильном пути со своим оригиналом awk
решение. Попробуй это; Я думаю, что это хорошее сочетание читаемого и эффективного:
awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile
Идея состоит в том, чтобы сказать Awk рассматривать пустые линии (2 последовательных новичка) как сепараторы записей. Затем каждая строфа рассматривается как единая запись, а пробелы (в данном случае одиночные новички) отделяет поля. Это очень похоже на то, что вы делали tr
, За исключением того, что теперь AWK будет работать через всю обработку файлов строфы за раз.
Другие советы
Вы можете использовать awk
как это:
awk 'NR%2 { printf "%s%s", $0, (NR+1)%6 ? " " : "\n" }' < test
Объяснение:
Вам нужно знать эти две вещи о awk
:
Синтаксис есть
condition { commands }
, кудаcommands
выполнены, еслиcondition
это правда (ненулевой).NR
это число текущей записи (то есть номера строки), начиная с 1.
Здесь состояние NR%2
, который ненулевой для нечетных линий. Таким образом, команда выполняется только для нечетных строк, которые вы хотите печатать. Увконые линии отбрасываются молча.
А printf
напечатает каждую нечетную линию, за которым следует либо пространство, либо новую линию. Ваш вход повторяется каждые 6 строк, и вам нужен новый линий после строк 5, 11, 17, так далее. Анкет Вы можете добавить 1 к каждому из этих чисел, чтобы он делился на 6, поэтому формула (NR+1)%6
0 для этих чисел.
Так (NR+1)%6 ? " " : "\n"
оценивается в пространство для строк 1 и 3, и новая линия для строки 5. Затем он повторяется для 7, 9 и 11; и так далее.
Вот один из способов использования Perl:
perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }'
Это печатает 1 -й, 3 -й, 5 -й, 7 -й, и т. Д. Строки файла. После 5 -го, 11 -го, 17 -го и т. Д. Линии он напечатает новую линию; После других строк он напечатает только вкладку.
(Примечание: это предполагает, что между последовательными группами из пяти строк есть ровно одна пустая строка. Если это нет Дело, тогда, пожалуйста, уточните.)