Преобразование записей на основе строк в столбец на основе оболочки - PullRequest
0 голосов
/ 17 февраля 2012

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

Пример файла (показаны только 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}'

Но как мне сделать это со всеми записями, прочитав весь файл?

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Вы можете использовать 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;и т. д.

0 голосов
/ 17 февраля 2012

Я думаю, что вы на правильном пути со своим оригинальным решением awk. Попробуй это; Я думаю, что это хорошее сочетание читабельности и эффективности:

awk 'BEGIN { RS="\n\n" } ; { print $1, $3, $5 }' < myfile

Идея состоит в том, чтобы заставить awk рассматривать пустые строки (2 последовательных перевода строки) как разделители записей. Затем каждый раздел обрабатывается как отдельная запись, а пробел (в данном случае одиночные переводы строк) разделяет поля. Это очень похоже на то, что вы делали с tr, за исключением того, что теперь awk будет проходить через весь файл, обрабатывая строфу за раз.

0 голосов
/ 17 февраля 2012

Вот один из способов использования Perl:

perl -ne 'chomp; if($. % 2 == 1) { print $_, ($. % 6 == 5) ? "\n" : "\t" }'

Это напечатает 1-ю, 3-ю, 5-ю, 7-ю и т. Д. Строки файла.После 5-й, 11-й, 17-й и т. Д. Строк будет напечатана новая строка;после других строк будет напечатана только вкладка.

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

...