2012-11-27 4 views
5
​​3210

私は3番目の列の値を依存するファイルをソートしたいので、私が使用します。3.guiで始まる行は行のでアウトです(:としてBash-行の1つの列に対してのみ-uniqを使用できますか?

sort -rnk3 myfile 

2.gu Qxy 23 
4.gui Qxr 21 
3.guT QWS 18 
1.gui Qxx 16 

は、今私は、出力する必要があります4.gui iは数百万行を持っているので、私は-headを使用することはできません

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

大きな値)を持って、私がいないカットする場所をやると、それは、ラインを扱うので、私は-uniqを使用する方法を見つけ出すことができませんでした全体と私は伝えることができないので-uniqは、最初の列を見るために、それを出力する一意の行をカウントします。これは正常です。私は

くださいアドバイス..

+0

可能重複と呼ばれるファイルにあった第三列(ポート)内のすべての重複を発見されたテキスト[列によって「UNIQ」に方法はありますか?](HTTP ://stackoverflow.com/questions/1915636/is-there-a-way-to-uniq-by-column) –

答えて

8

はこれを試してみてください。.. -uniqは、文字の数を無視していますが、最初の列は、様々な文字数を持っているかもしれないの例から見ることができるようにすることができます知っている:

sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++' 

awkは削除されます2列目に応じて重複します。これは実際に重複を削除する有名なawk構文です。 2番目のフィールドのレコードが維持されている配列が維持されます。レコードが印刷される前に、2番目のフィールドが配列内でチェックされます。存在しない場合は印刷され、それ以外の場合は重複して廃棄されます。これは++を使用して実現されます。初めてレコードが見つかると、この++はその修正後のカウントを0に保ちます。後続の発生は、否定されたときに偽になる値を増加させる。ここで

+0

@Guru .. -awkコマンドについて説明してもらえますか? – teutara

+1

@teutara: – Guru

+0

-更新されました。私は2番目の行(ハッシング)を使用する理由を理解していませんでした。 – teutara

2

あなたが行く:

sort -rnk3 file | awk -F'[. ]' '{ if (a[$2]++ == 0) print }' 

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

これは、フィールドセパレータで空白や期間のいずれかである2番目のフィールドに重複する値をチェックするためにawkを使用しています。 $1は、最初のフィールドを表し、行全体を表し、というように。..

awk -F'[. ]' '{ if (a[$2]++ == 0) print }'-Fオプションが指定してみましょうawk

$ awk -F'[. ]' '{ print $2 }' file 

gu 
gui 
guT 
gui 

変数$0:だから、これはそれのように2番目のフィールドを扱うものですフィールド区切り文字。この場合、空白かピリオドのどちらかです。

+0

ちょっと@sudo_O ..再び感謝します。あなたは-awkコマンドにlitleを説明してください。 – teutara

0

だから私はすべてのパワフルで驚くべきGoogleによってこれを見つけた。 私の小さなスクリプトは@sudo_Oの答えを作り出している。重複していないファイルではない。

私はのmaster.txt

 
awk '{if (a[$3]++ > 0) print}' master.txt | while read site thread port 
do 
    grep $port master.txt 
done 
関連する問題