awk 可以同时读取多个输入文件吗?

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

是的,您可以使用 awk 同时读取多个文件。

为了做到这一点,你应该使用命令getline明确控制输入。

特别是,你想getline与文件一起使用这样您就不会读取作为 awk 主要参数传递的文件。

就你的情况而言,有一种可能性:

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

这并没有做太多的错误处理或其他事情,而且正如您所注意到的,文件名现在已硬编码在 awk 脚本中。您可以以某种方式修复这些问题,但代价是脚本会变得非常丑陋。

因此,虽然是的,您可以从 执行此操作awk

(旁注:从 awk 执行此操作是否是个好主意,这是另一回事……在我看来,从这里开始很快就会变得混乱,所以你最好现在切换到更高级的语言,例如 Python、Perl、Ruby、Lua 等,因为这种语言会比你在 awk 中获得的更好地支持文件句柄和对象。虽然 bash / shell 脚本在处​​理多个文件方面会做得更好,但我也不推荐这样做,因为它在编写模块化可维护可测试代码方面不如前面提到的脚本。只是我的 2c。)

相关内容