あるコマンドから別の2つのコマンドへのパイプ出力

あるコマンドから別の2つのコマンドへのパイプ出力

あるコマンドの出力を別の2つのコマンドにパイプする必要があります。

cat filename.txt | tail -n 1
cat filename.txt | wc -l

ファイルが大きいので、2回読み取ることを避けたいです。コマンドを確認しましたが、tee不要なファイルに出力がリダイレクトされます。関連投稿は多いが、関連内容は見つからなかった。

答え1

私が正しく理解した場合は、行番号でファイルの最後の行を取得したいと思います。

$ cat a
aaa
bb
ccc
$
$ awk 'END{print $0; print NR}' a
ccc
3

変数に保存する必要があるため:

$ out=$(awk 'END{print $0"|"NR}' a)
$ last_line=$(echo $out | awk -F"|" '{print $1}' )
$ tot_cnt=$(echo $out | awk -F"|" '{print $2}' )
$ echo $last_line
ccc
$ echo $tot_cnt
3

答え2

{   
    {   tee /dev/fd/3 | wc -l >&4
    }   3>&1 | tail -n1
}   <filename.txt 4>&1

2回の読み出しは避けられませんが、マルチコアシステムでは同時に読み取ることができます。ただし、出力順序の保証はありません。

しかし、おそらくあなたが求めているものをシミュレートする最速の方法は次のとおりです。

dd bs=64k <filename.txt | tail -n1

dd読み書きをstderrに報告するまだすべてのファイルを標準出力にコピーします。

答え3

寝てくださいcat。必要ありません。

使用:

tail -n 1 filename.txt
wc -l filename.txt

関連情報