【问题标题】:How can I send the out of the last pipe to two different commands?如何将最后一个管道的输出发送到两个不同的命令?
【发布时间】:2021-01-27 21:55:50
【问题描述】:

所以,我有一堆数字的文本文件,每行一个数字是具体的,所以我这样做:- cat filename.txt|sort -n|head -1 获得最高号码,我可以通过cat filename.txt|sort -n|tail -1 获得最低号码。 只是为了确定有没有一种方法可以将cat filename.txt|sort -n| 及其输出发送到一行中的两个不同命令并具有输出(最高数字和最低数字彼此相邻)

【问题讨论】:

    标签: bash shell pipe


    【解决方案1】:

    您可以使用tee 和进程替换做有趣的事情,但输出的顺序可能不稳定(由于进程的计时)

    sort -n filename.txt | tee >(tail -1 >/dev/tty) | head -1
    

    在这种情况下,我会使用 sed 打印第一行和最后一行:

    sort -n filename.txt | sed -n '1p; $p'
    

    正如@chepner 建议的那样

    ... | sed -n '1p; $p' | paste - -     # tab separated
    

    ... | awk 'NR == 1 {first = $0} END {print first, $0}'   # space separated
    

    【讨论】:

    • 有没有办法让两个输出在同一行并且彼此相邻?
    • 通过paste - - 传递它。
    【解决方案2】:

    有一个有用的命令tee语法tee second.txt会输出到second.txt

    您可以将其与 bash 执行管道结合使用,例如 tee >(wc)

    所以你可以通过 tee >(wc) | head 执行 2 个或更多命令

    【讨论】:

      最近更新 更多