Извлечение данных и сохранение в разных выходных файлах - PullRequest
0 голосов
/ 11 октября 2018

У меня есть файл данных в следующем формате:

aaa     0
bbb     1
ccc     2
ddd     ?
eee     0
fff     1
ggg     2
hhh     3
iii     ?
   ...

То, что я хочу сделать, довольно просто: извлечь и сохранить части данных в разных файлах с критериями разделения, принимая тольколинии между 0 и '?'чтобы я получил:

output_1.txt>

aaa     0
bbb     1
ccc     2
ddd     ?

output_2.txt>

eee     0
fff     1
ggg     2
hhh     3
iii     ?

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

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Все, что вам нужно:

awk 'NR==1 || $NF=="?"{close(out); out="output_"++cnt".txt"} {print > out}' file

Вышеприведенное будет работать с любым awk в любой оболочке в любой системе UNIX для любого размера входного файла.

Если вы хотите сделатьчастичное совпадение на ? (см. комментарии ниже), тогда это будет один из следующих вариантов:

awk 'NR==1 || index($NF,"?"){close(out); out="output_"++cnt".txt"} {print > out}' file

awk 'NR==1 || $NF~/\?/{close(out); out="output_"++cnt".txt"} {print > out}' file

awk 'NR==1 || $NF~/[?]/{close(out); out="output_"++cnt".txt"} {print > out}' file
0 голосов
/ 11 октября 2018

Вы можете перенаправить операторы печати в awk:

awk -v n=1 '{print > ("output_" n ".txt")} $2 == "?" {n++}' file

Если ваш файл большой, вам, возможно, придется явно закрыть открытый файл:

awk -v n=1 '
    {print > ("output_" n ".txt")} 
    $2 == "?" {close("output_" n ".txt"); n++}
' file

Если ячувствовал себя действительно сухим, я бы написал

awk -v n=1 '
    function filename(n) {return "output_" n ".txt"} 
    {print > filename(n)} 
    $2 == "?" {close(filename(n++))}  # important, post-increment
' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...