標準出力を接続してテーブルに置き換える

標準出力を接続してテーブルに置き換える

私が持っているとしましょう:

$ 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

tr変換するデータを提供するには、名前付きパイプが追加で必要ですpaste。このpasteユーティリティは、生データと変換データの2つのストリームを読み取る必要があります。そのうちの1つは標準ストリームであり、もう1つは上記のように元のファイル(ファイルを2番目に読み取る)または名前付きパイプからインポートする必要があります。

答え2

簡単な解決策は次のとおりです。アッ

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
)

関連情報