Преобразовать ввод на основе строк в столбец на основе Shell

StackOverflow https://stackoverflow.com/questions/9321938

Вопрос

Мне нужна ваша помощь при вводе нескольких строк в разные столбцы. И сделать то же самое со всеми записями в файле.

Пример файла (показывая только 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 -го и т. Д. Линии он напечатает новую линию; После других строк он напечатает только вкладку.

(Примечание: это предполагает, что между последовательными группами из пяти строк есть ровно одна пустая строка. Если это нет Дело, тогда, пожалуйста, уточните.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top