假设我有:
$ 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.txt
2/ 提供来自终端的内容(就像由命令的输出生成的一样)。为此,我尝试对此进行修改,但没有走得太远:
$ 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
您需要额外的命名管道才能提供tr
to转换的数据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
)