3

タブで区切られたフィールドを持つ入力ファイルがあり、最初のフィールドが整数であるとします。

1 abc
1 def
1 ghi
1 lalala
1 heyhey
2 ahb
2 bbh
3 chch
3 chchch
3 oiohho
3 nonon
3 halal
3 whatever

まず、最初のフィールドの一意の値の数を計算する必要があります。これは次のようになります。

5 for 1, 2 for 2, and 6 for 3

次に、これらのカウントの最大値を見つける必要があります。この場合は6です。

次に、「6」をパラメーターとして別のawkスクリプトに渡す必要があります。

以下のコマンドを使用して、カウントのリストを取得できることを知っています。

cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort 

しかし、最初のカウント数を取得して、入力ファイルとしてではなくパラメーターとして次のawkコマンドに渡すにはどうすればよいですか?

4

3 に答える 3

5

これはawkに固有のものではありません。

プログラムはstdinから読み取ることができ、次にパイプを使用して入力を渡すことができます。

prg1 | prg2 

または、プログラムがパラメータとして入力を期待している場合は、

prg2 $(prg1) 

どちらの場合も、prg1はprg2の前に処理されることに注意してください。

一部のプログラムでは両方の可能性が許可されていますが、大量のデータが引数として渡されることはめったにありません。

于 2012-06-01T22:48:05.070 に答える
3

この AWK スクリプトは、パイプライン全体を置き換えます。

awk -v parameter="$(awk '{a[$1]++} END {for (i in a) {if (a[i] > max) {max = a[i]}}; print max}' inputfile)" '{print parameter}' otherfile

where'{print parameter}'は他の AWK スクリプトの代用であり、「otherfile」はそのスクリプトの入力です。

注: 2 つの AWK スクリプトを 1 つに結合できる可能性が非常にawk高く、これは、質問で概説されている方法 ( feed awk) で実行するよりもハックが少なくなります。

于 2012-06-02T04:03:37.963 に答える
2

シェルの$()コマンド置換を使用できます。

awk -f script -v num=$(cut -f1 input.txt | sort | uniq -c | awk -F ' ' '{print $1}' | sort | tail -1) < input_file

tail -1(最大で 1 行が使用されるように を追加しました。)

于 2012-06-01T22:42:10.993 に答える