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

3列目の値に応じてファイルを並べ替えたいので、次を使用します。

sort -rnk3 myfile

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

今、私は次のように出力する必要があります:(4.guiの行の値が大きいため、3.guiで始まる行は出力されていません)

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

-head何百万もの行があり、カットする場所がないため使用できません。行を全体として扱い、最初の列を見るように指示できないため、使用方法を理解できませんでした-uniq-uniq固有のものを出力します-これは正常です-。多くの文字を無視できることはわかっ-uniqていますが、例からわかるように、最初の列にはさまざまな文字数がある可能性があります..

ご意見をお聞かせください..

4

3 に答える 3

8

これを試して:

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

awk は、2 番目の列に応じて重複を削除します。これは実際には、重複を削除するための有名な awk 構文です。2 番目のフィールドのレコードが保持されている場所に配列が保持されます。レコードが印刷されるたびに、配列の 2 番目のフィールドがチェックされます。存在しない場合は印刷され、存在しない場合は重複しているため破棄されます。これは ++ を使用して達成されます。初めてレコードが検出されたとき、この ++ は後置修正以降、カウントを 0 のままにします。後続の発生は値を増加させ、否定されると false になります。

于 2012-11-27T11:43:34.563 に答える
2

どうぞ:

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

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

これはawk、フィールド区切り記号が空白またはピリオドのいずれかである 2 番目のフィールドの重複値をチェックするために使用します。したがって、これは 2 番目のフィールドを次のように扱います。

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

gu
gui
guT
gui

awk変数では$0、行全体を$1表し、最初のフィールドを表すなど..

awk -F'[. ]' '{ if (a[$2]++ == 0) print }'この-Fオプションを使用すると、フィールド セパレータを指定できます。この場合は、空白またはピリオドです。

于 2012-11-27T11:51:17.067 に答える