web-dev-qa-db-ja.com

awkでの並べ替えとuniq

「sort」と「uniq」があることは知っていますが、今日の問題は、AWKを使用してそのような仕事をどのように行うかについてです。本当に何かのリスト(ip、名前、または番号)があり、それらを並べ替えたい場合は、

メールログからIP番号を取得する例を次に示します。

awk 'match($0,/\[[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\]/) { if ( NF == 8 && $6 == "connect" ) {print substr($0, RSTART+1,RLENGTH-2)} }' maillog

同じawkコマンド内で「オンザゴー」でそれらを並べ替えることは可能ですか?質問に対する完全な回答は必要ありませんが、どこから始めるべきかについてのヒントがいくつかあります。

乾杯!

7
Peter

ソートするには、次のようにawkコマンド内でもパイプを使用できます。

awk '{ print ... | "sort ..." }'

構文は、データファイルのすべてのそれぞれの行が同じ並べ替えのインスタンスに渡されることを意味します。

もちろん、シェルレベルでも同等に実行できます。

awk '{ print ... }' | sort ...

または、GNU awkを使用できます。これには、2つのソート関数がネイティブに定義されています。

uniqawkにあります。通常、「一意のデータ要素またはキー」を連想配列に保存し、新しいデータを記憶する必要があるかどうかを確認します。説明する1つの例:

awk '!a[$0]++'

つまり、現在の行が配列にない場合、条件は真であり、行を印刷するデフォルトのアクションがトリガーされます。同じデータを含む後続の行は誤った状態になり、データは印刷されません。

12
Janis