私は awk コマンドの出力を、Bash シェルで一度に複数のコマンドにパイプしようとしています。
awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u)
awk コマンドの結果をカウントしてソートしたいのですが、どうすればそれを達成できますか? && コマンドを使用しても機能しません。最初のコマンドを実行してから終了します。失敗しているのはbashに関する私の知識だと思います。
前もって感謝します。
1 行で 2 つの異なるコマンドに出力を送信する場合は、プロセス置換を行う必要があります。
これを試して:
awk '$13 ~ /type/ {print $15}' filename.txt | tee >(wc -l >&2) | sort -u
これにより、stderr に行数が出力され、stdout に並べ替えられた出力が出力されます。stdout で行数が必要な場合は、 を省略できます>&2
が、それはソート呼び出しに渡され、(ほとんどの場合) 出力の先頭にソートされます。
編集:さらなるテストに基づいて何が起こるかの修正された説明。
その場合、 awk で数えます 、なぜパイプが必要なのですか? もっと複雑にしないで
awk '$13 ~ /type/ {print $15;c++}END{print c} ' filename.txt | sort -u
出力のサイズが大きすぎてメモリに収まらず、パフォーマンス上の理由からコマンドwc
とコマンドを並行して実行する必要がない場合は、比較的簡単な解決策を次に示します。sort
output=$(awk '$13 ~ /type/ {print $15}' filename.txt; echo a)
printf "%s" "${output%a}" | sort -u
printf "%s" "${output%a}" | wc -l
エクストラの複雑さは、コマンドが入力の最後にいくつかの空の行を出力する可能性がa
ある場合に備えており、構成はそれを取り除きます。または のどちらを最初に表示するかを簡単に選択できます。awk
$()
sort
wc
/dev/fd
これは、任意の POSIX シェル (ash、bash、ksh、zsh、...) で動作する方法ですが、 (かなり最近の Linux、*BSD、および Solaris を含む) システムでのみ動作します。bash 、 ksh93 、および zsh で利用可能なより単純な方法を使用した Walter の同様の構成のように、の出力wc
と の出力sort
が混在する場合があります。
{
awk '$13 ~ /type/ {print $15}' filename.txt |
tee /dev/fd3 |
wc -l
} 3>&1 1>&3 | sort -u
メモリに快適に収まらない中間出力を処理する必要があり、2 つのコマンドの出力を混在させたくない場合は、POSIX シェルに簡単な方法があるとは思いませんが、 ksh または zsh コプロセスで実行可能。
より大きな問題は、出力がどのようになることを期待しているのかということだと思います。
2 つのことをしようとしている場合は、次の 2 つのことを行います。
awk '$13 ~ /type/ {print $15}' filename.txt > tempfile
wc -l < tempfile
sort -u < tempfile
rm tempfile
mkfifo で作成した名前付きパイプを、tee と組み合わせて使用したい。例はhttp://www.softpanorama.org/Tools/tee.shtmlにあります