2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48

UNIXで1カラムのみでソートするには?

私は、Unixの sort のための-kオプションを使用すると、特定の列と以下のすべてでソートすることができることを知っています。例えば、入力ファイルがあるとします。

2 3
2 2
1 2
2 1
1 1

sort -n -k 1 を使うと、1列目でソートされた後に2列目でソートされた出力が得られます:

1 1
1 2
2 1
2 2
2 3

となります。

1 2
1 1
2 3
2 2
2 1

これはsortコマンドで可能ですか?

回答 (3)

68
68
68
2009-08-31 16:28:27 +0000

これを試してみてください。

sort -s -n -k 1,1

-s は「最後の砦」ソートを無効にします。

-k 1 は数値ソートの文脈では「このフィールドとそれに続くすべてのフィールド」という意味ではなく、2番目の列でソートしてみるとわかるように、「このフィールドとそれに続くすべてのフィールド」という意味です。単に残りの行に行くことで紐が切れているのを見ているだけです。しかし、一般的には、第1フィールドでのみソートするには-k 1,1を指定する必要があります。

10
10
10
2012-10-16 13:59:28 +0000

最初の列だけをソートするには、以下のようにします。

sort -n -s -k1,1

From Unix and Linux System Administration Handbook

sort はキー指定 -k3 を受け入れますが、おそらくあなたが期待しているようなことはしないでしょう。終了フィールド番号がない場合、ソートキーは行末まで続きます。

2
2
2
2016-12-30 17:47:12 +0000

提供された回答のどれも、私にとっては一般的には機能しません。

sort -s -k 2 file1sort -n -k1,1 の両方がこのファイルで追加のソートを行います。

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

私はこれと全く同じことをしなければならず、結局シェルループを使うことになりました。ソートされた列の一意の値ごとにファイル全体を読み込む必要があるため、この解決策は非常に大きなファイルではうまくいかないかもしれません。

ここでは、ファイルは2列目のみでソートされています。

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7