awk, деление строк в файле на две строки вывода - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать два файла из входного файла. Выходные файлы будут иметь одинаковую информацию заголовка (взятую из исходного файла), и я затем хочу выделить последующие строки на основе значения.

В данный момент я застрял, когда кажется, что, когда строка завершается неудачно с оператором «если», последнее значение, которое она имела, все еще добавляется, я думаю.

Мой ввод выглядит примерно так: -

#START  STOP  INFO
1  100  700  Q=2;S=40;LENGTH=600
2  300  350  Q=5;S=50;LENGTH=50
3  567  601  Q=3;S=2;LENGTH=34

Мой код выглядит так: -

awk -v short="" -v long=""  'BEGIN{FS="\t"}{if ($1 !~/#/) {sub(/.*LENGTH=/, ""); sub(/;.*/, ""); if ($NF >= 500 ) { long=$0 }}  else { long=$0; short=$0 }}{print long}' test.txt

Мой вывод для длинного файла выглядит так: -

#START STOP INFO
1  100   700  Q=2;S=40;LENGTH=600
1  100   700  Q=2;S=40;LENGTH=600
1  100   700  Q=2;S=40;LENGTH=600

И вывод для короткого файла выглядит так: -

#START STOP INFO
#START STOP INFO
#START STOP INFO

В то время как я хочу, чтобы «long» должен выглядеть так:

#START STOP INFO
1  100   700  Q=2;S=40;LENGTH=600

И «коротким» будет: -

#START STOP INFO
2  300  350  Q=5;S=50;LENGTH=50
3  567  601  Q=3;S=2;LENGTH=34

(т. Е. Значение длины для следующих двух строк меньше 500 и поэтому должно быть добавлено к «короткой» строке, но по какой-то причине предыдущая строка - та, которая больше 500 - добавляется дважды)

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Я полагаю, что вы собираетесь сделать следующее:

awk -v long="longfile.txt" -v short="shortfile.txt" \
    -v val=500 -F "="                               \
    '/^#/{ print > long; print > short } # print header
    ($NF>val) { print > long; next }     # print long file
    { print > short }' <file>            # print short file
0 голосов
/ 04 мая 2018

Хорошо, похоже, это работает, не уверен, есть ли у кого-нибудь предложения по улучшению?

awk -v short="" -v long=""  '{if ($1 ~/#/){long = long "\n" $0; short = short "\n" $0} else { line=$0; sub(/.*LENGTH=/, ""); sub(/;.*/, ""); if ( $NF >= 500 ){long = long "\n" line } else { short = short "\n" line}}}END{print long, short}' test.txt
...