使用标准输出作为 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.txt
的 1st,6th and 7th
列进行比较,并添加 file1.txt
的 3rd 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.txt
的 standard 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)
我有一个文件,由于权限问题无法进行任何修改。
所以我只能使用一个工具及其视图选项来可视化文件,该工具将其内容打印到标准输出,其中包含 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.txt
的 1st,6th and 7th
列进行比较,并添加 file1.txt
的 3rd 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.txt
的 standard 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)