あるコマンドの出力を別の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