awk может одновременно считать несколько входных файлов?

У меня есть следующий код, который хорошо работает:

$ awk 'FILENAME==ARGV[1] {a[FNR]=$0} FILENAME==ARGV[2] {print a[FNR],FS,$0}' tab1 tab2

(tab1 содержит верхние регистры), вывод:

3A  3B  3C  3D   1a  1b  1c  1d
3A  3B  3C  3D   2a  2b  2c  2d
3A  3B  3C  3D   3a  3b  3c  3d

Этот метод использует массив a[] который мог быть очень большим для файлов, я хочу использовать. Существует ли способ, которым я могу избегать использования массива? Я просто хочу считать первую строку tab1 и первая строка tab2, затем процесс и печать и затем идут дальше к следующей строке?

Количество входных файлов могло быть целых пятью.

1
задан 12 August 2019 в 19:20

1 ответ

Да, можно читать из нескольких файлов одновременно с помощью awk.

Чтобы сделать это, необходимо использовать getline управляйте для явного управления входом.

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

Одна возможность, в Вашем случае:

$ awk '{
      getline line < "tab2"
      print $0, FS, line
  }' tab1

Это не делает большой обработки ошибок или чего-либо, и как можно заметить, имя файла теперь hardcoded в awk сценарии. Можно устранить те проблемы так или иначе, за счет создания сценария, действительно более ужасного.

Так, в то время как да, можно сделать это от awk.

(Примечание стороны: Является ли это хорошей идеей сделать это от awk, это - другая история... По-моему, это начинает становиться грязным действительно быстро отсюда, таким образом, Вы - вероятно, более обеспеченное переключение теперь на высокоуровневый язык, такой как Python, Perl, Ruby, Lua, и т.д., поскольку такой язык окажет Вам намного лучшую поддержку дескрипторам файлов и объектам, чем, что Вы войдете в awk. В то время как удар / сценарии оболочки сделали бы несколько лучше имея дело с несколькими файлами, я не рекомендую, что также, так как это не делает столь же хороший как вышеупомянутые в записи модульного удобного в сопровождении тестируемого кода. Просто мой 2c.)

2
ответ дан 7 December 2019 в 13:15

Другие вопросы по тегам:

Похожие вопросы: