Как закрыть файл в awk при создании списка? - PullRequest
0 голосов
/ 06 июля 2018

Ребята, я пытаюсь найти способ избежать ошибки awk "слишком много открытого файла". Вот моя ситуация:

INPUT: файл ASCII, много строк, по этой схеме:

NODE_212_lenght.._1
NODE_212_lenght.._2
NODE_213_lenght.._1
NODE_213_lenght.._2

Чтобы разделить этот файл с каждой записью с одинаковым номером NODE, я использовал эту однострочную команду awk

awk -F "_" '{print >("orfs_for_node_" $2 "")}' <file

Для файла, состоящего из множества строк, эта команда повторяет "слишком много открытых файлов". Я пробовал также, разделив 2k строк, то же самое. На самом деле я не могу перейти под 2k строк, потому что входной файл - это огромный файл.

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

awk -F "_" '{print >("orfs_for_node_" $2 ""); close(orfs_for_node_*)}' <file 

но это не даст результата.

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Насколько я понимаю, вы ищете подходящий момент для close файла. Для вашего примера входного контента вы можете сделать:

awk -F "_" 'BEGIN{prefix="orfs_for_node_"} 
NR>1&&$2!=last{close(prefix""last)}{last=$2;print >(prefix$2)}' inputFile

Проверяет $2, изменилось ли оно, затем закрывает файл с последним $2. Это предполагает, что строки в вашем файле отсортированы по $2

Если он не отсортирован по $2, используйте >>

0 голосов
/ 06 июля 2018

Если вы переключитесь на GNU awk, он с этим справится. В противном случае это правильный синтаксис, если во входном файле есть все строки для каждого значения $ 2, сгруппированные вместе:

awk -F '_' '{out="orfs_for_node_"$2} out!=prev{close(prev)} {print > out; prev=out}' file

В противном случае вам нужно использовать >> вместо >:

awk -F '_' '{out="orfs_for_node_"$2} out!=prev{close(prev)} {print >> out; prev=out}' file

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

0 голосов
/ 06 июля 2018

Ваш вопрос не столь ясен, но вы пытаетесь упомянуть здесь простое решение, которое вы могли бы принять как стартовое и затем поработать над ним. комментарии в этом посте тоже)

awk 'prev!=FILENAME{close(prev);count++}{print > "out"count);prev="out"count}' *.txt

OR

awk 'prev!=FILENAME{close(prev);count++;prev="out"count}{print > "out"count)}' *.txt

Пожалуйста, измените print > "out"count на print > ("out"count), если ваш awk НЕ GNU.

Краткое объяснение кода: этот код создаст переменную с именем prev, которая будет иметь значение выходного файла, и закроет предыдущий файл (например, out1 будет закрыто, когда out2 начинает читать и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...