4

私は awk コマンドの出力を、Bash シェルで一度に複数のコマンドにパイプしようとしています。

awk '$13 ~ /type/ {print $15}' filename.txt | (wc -l || sort -u)

awk コマンドの結果をカウントしてソートしたいのですが、どうすればそれを達成できますか? && コマンドを使用しても機能しません。最初のコマンドを実行してから終了します。失敗しているのはbashに関する私の知識だと思います。

前もって感謝します。

4

5 に答える 5

5

1 行で 2 つの異なるコマンドに出力を送信する場合は、プロセス置換を行う必要があります。

これを試して:

awk '$13 ~ /type/ {print $15}' filename.txt | tee >(wc -l >&2) | sort -u

これにより、stderr に行数が出力され、stdout に並べ替えられた出力が出力されます。stdout で行数が必要な場合は、 を省略できます>&2が、それはソート呼び出しに渡され、(ほとんどの場合) 出力の先頭にソートされます。

編集:さらなるテストに基づいて何が起こるかの修正された説明。

于 2010-08-03T15:35:37.810 に答える
4

その場合、 awk で数えます 、なぜパイプが必要なのですか? もっと複雑にしないで

awk '$13 ~ /type/ {print $15;c++}END{print c} ' filename.txt | sort -u
于 2010-08-03T15:50:56.253 に答える
1

出力のサイズが大きすぎてメモリに収まらず、パフォーマンス上の理由からコマンド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$()sortwc


/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 コプロセスで実行可能。

于 2010-08-03T22:39:17.430 に答える
0

より大きな問題は、出力がどのようになることを期待しているのかということだと思います。

2 つのことをしようとしている場合は、次の 2 つのことを行います。

awk '$13 ~ /type/ {print $15}' filename.txt > tempfile
wc -l < tempfile
sort -u < tempfile
rm tempfile
于 2010-08-03T15:32:10.370 に答える
0

mkfifo で作成した名前付きパイプを、tee と組み合わせて使用​​したい。例はhttp://www.softpanorama.org/Tools/tee.shtmlにあります

于 2010-08-03T15:33:24.357 に答える