连接标准输出并将其替换到表中

连接标准输出并将其替换到表中

假设我有:

$ cat tmp1.txt
a
b
c

然后

$ paste tmp1.txt <(tr '[:lower:]' '[:upper:]'<tmp1.txt)
a   A
b   B
c   C

我该如何修改上面的内容

1/tmp1.txt只调用一次? (我猜测tee

tmp1.txt2/ 提供来自终端的内容(就像由命令的输出生成的一样)。为此,我尝试对此进行修改,但没有走得太远:

$ cat<< 'EOF' | tee >(tr '[:lower:]' '[:upper:]')
a
b
c
EOF

其输出:

a
b
c
A
B
C

答案1

使用命名管道为tee和之间的数据创建附加通道tr

$ mkfifo pipe
$ tee pipe <file | paste - <( tr '[:lower:]' '[:upper:]' <pipe )
a       A
b       B
c       C

或者(但不那么好看),将 移到tr左侧|

$ mkfifo pipe
$ tee >( tr '[:lower:]' '[:upper:]' >pipe ) <file | paste - pipe

您需要额外的命名管道才能提供trto转换的数据paste。该paste实用程序需要读取两个流:原始数据和转换后的数据。其中一个可以是标准流,而另一个需要来自原始文件(第二次读取文件)或命名管道,如上所示。

答案2

一个简单的解决方案使用awk

awk ' { print $0 , toupper($0) ; } ' /tmp/tmp1.txt

或者

( echo a ; echo b ; echo c ;  ) | awk ' { print $0 , toupper($0) ; } '

或者使用命名管道或 fifo

( echo a ; echo b ; echo c ) |
(
  D=$(mktemp -d) ;
  (
    cd $D ;
    mkfifo fifo_a fifo_b ;
    paste fifo_b <( tr '[:lower:]' '[:upper:]' < fifo_a ) &
    tee  fifo_a  > fifo_b  ;
    wait ;
    rm fifo_a fifo_b
  ) ;
  rmdir $D
)

相关内容