我有以下运行良好的代码:
$ 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
是的,您可以使用 awk 同时读取多个文件。
为了做到这一点,你应该使用命令getline
明确控制输入。
特别是,你想getline
与文件一起使用这样您就不会读取作为 awk 主要参数传递的文件。
就你的情况而言,有一种可能性:
$ awk '{
getline line < "tab2"
print $0, FS, line
}' tab1
这并没有做太多的错误处理或其他事情,而且正如您所注意到的,文件名现在已硬编码在 awk 脚本中。您可以以某种方式修复这些问题,但代价是脚本会变得非常丑陋。
因此,虽然是的,您可以从 执行此操作awk
。
(旁注:从 awk 执行此操作是否是个好主意,这是另一回事……在我看来,从这里开始很快就会变得混乱,所以你最好现在切换到更高级的语言,例如 Python、Perl、Ruby、Lua 等,因为这种语言会比你在 awk 中获得的更好地支持文件句柄和对象。虽然 bash / shell 脚本在处理多个文件方面会做得更好,但我也不推荐这样做,因为它在编写模块化可维护可测试代码方面不如前面提到的脚本。只是我的 2c。)