У меня есть следующий код, который хорошо работает:
$ 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
, затем процесс и печать и затем идут дальше к следующей строке?
Количество входных файлов могло быть целых пятью.
Да, можно читать из нескольких файлов одновременно с помощью awk.
Чтобы сделать это, необходимо использовать getline
управляйте для явного управления входом.
В частности, Вы хотите использовать getline
с файлом так, чтобы Вы не читали из файла (файлов), передал в как основные аргументы awk.
Одна возможность, в Вашем случае:
$ awk '{
getline line < "tab2"
print $0, FS, line
}' tab1
Это не делает большой обработки ошибок или чего-либо, и как можно заметить, имя файла теперь hardcoded в awk сценарии. Можно устранить те проблемы так или иначе, за счет создания сценария, действительно более ужасного.
Так, в то время как да, можно сделать это от awk
.
(Примечание стороны: Является ли это хорошей идеей сделать это от awk, это - другая история... По-моему, это начинает становиться грязным действительно быстро отсюда, таким образом, Вы - вероятно, более обеспеченное переключение теперь на высокоуровневый язык, такой как Python, Perl, Ruby, Lua, и т.д., поскольку такой язык окажет Вам намного лучшую поддержку дескрипторам файлов и объектам, чем, что Вы войдете в awk. В то время как удар / сценарии оболочки сделали бы несколько лучше имея дело с несколькими файлами, я не рекомендую, что также, так как это не делает столь же хороший как вышеупомянутые в записи модульного удобного в сопровождении тестируемого кода. Просто мой 2c.)