使用标准输出作为 awk 的输入

Use standard output as an input in awk

我有一个文件,由于权限问题无法进行任何修改。

所以我只能使用一个工具及其视图选项来可视化文件,该工具将其内容打印到标准输出,其中包含 8 个制表符分隔的列:

foo-tool view file1.txt
ALICE  .  CANDY   1990  . 76 76 78
MARK   .  CARAMEL 1991  . 45 88 88
CLAIRE .  SALTY   XXX   . 77 82 12

我确实有另一个文件,我想将其 1st,6th and 7th 列与 file1.txt1st,6th and 7th 列进行比较,并添加 file1.txt3rd and 4th 列=] 到 file2.txt 如果这些列中有任何匹配项。

file2.txt
ALICE  .  CANDY   1990  . 76 76 97
MARK   .  CARAMEL 1991  . 45 88 87
BLAINE .  SALTY   XXX   . 77 82 10

如果我能够打开 file1.txt 而不仅仅是标准输出,我会做 :

awk 'NR==FNR { a[,,] = [=12=]; next }(,,) in a { print a[,,], ,  }' file1.txt file2.txt

所以输出将是:

ALICE  .  CANDY 1990  . 76 76 78 CANDY    1990
MARK   .  54    1991  . 45 88 88 CARAMEL  1991

但是,由于我无法将 file1.txtstandard output 用作文件,所以我不知道如何进行。 我试图打开它并引导它的标准输出,但它不起作用:

foo-tool view file1.txt | awk 'NR==FNR { a[,,] = [=14=]; next }(,,) in a { print a[,,], ,  }' ARG[] file2.txt 

如何在 awk 中将标准输出作为文件输入作为文件之一传递?

"-"(破折号)是一个特殊的文件名,表示标准输入。许多 Unix 工具都使用此约定,尤其是 awk

您的命令行必须是:

$ foo-tool view file1.txt | awk '{ your_program }' - file2.txt

或者,如果您的系统支持(Linux 支持),您可以使用 /dev/stdin 文件:

$ foo-tool view file1.txt | awk '{ your_program }' /dev/stdin file2.txt

如果您的 shell 支持,您也可以使用 "process substitution"(bash,ksh 和 zsh 支持):

$ awk '{ your_program }' <(foo-tool view file1.txt) file2.txt

如果您必须处理多个不同命令的输出,这可能会有用,例如:

$ awk '{ your_program }' <(foo-tool view file1.txt) <(foo-tool view file2.txt)