代码之家  ›  专栏  ›  技术社区  ›  bapors

在awk中使用标准输出作为输入[重复]

  •  1
  • bapors  · 技术社区  · 6 年前

    这个问题已经有了答案:

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

    因此,我只能使用工具及其视图选项来可视化文件,该工具将其内容打印到带有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 并添加 3rd and 4th 文件1.TXT file2.txt 如果这些列中有任何匹配。

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

    如果我能打开 文件1.TXT 我会这样做,而不仅仅是标准输出:

    awk 'NR==FNR { a[$1,$6,$7] = $0; next }($1,$6,$7) in a { print a[$1,$6,$7], $3, $4 }' file1.txt file2.txt
    

    所以输出是:

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

    但是,因为我不能用 standard output 属于 文件1.TXT 作为一个文件,我一直在研究如何继续下去。 我试图打开它并指导它的标准输出,但它不起作用:

    foo-tool view file1.txt | awk 'NR==FNR { a[$1,$6,$7] = $0; next }($1,$6,$7) in a { print a[$1,$6,$7], $3, $4 }' ARG[$1] file2.txt 
    

    如何将标准输出作为awk中的一个文件输入传递给awk?

    1 回复  |  直到 6 年前
        1
  •  2
  •   xhienne    6 年前

    - “(破折号)是表示标准输入的特殊文件名。这种约定在许多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支持“进程替换”(bash、ksh和zsh do),您也可以使用“进程替换”(process substitution):

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

    如果必须处理几个不同命令的输出,例如:

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