web-dev-qa-db-ja.com

UNIXを1列のみでソートする方法

私は、Unix ソート の-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

しかし、私はこのように2列目の順序を保ちたいと思います。

1 2
1 1
2 3
2 2
2 1

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

46
ssn

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

sort -s -n -k 1,1

-sは 'last-resort'ソートを無効にします。これは指定されたキーの一部ではなかった全てをソートします。

-k 1は、2列目でソートしようとした場合にわかるように、実際には数値ソートのコンテキストでは「このフィールドと以下のすべて」を意味するものではありません。あなたは単に関係の残りの部分に行くことによって関係が壊れているのを見ています。ただし一般的には、フィールド1でソートのみするには-k 1,1を指定する必要があります。

62
Cascabel

最初の列のみをソートするには、次のようにします。

sort -n -s -k1,1

から UnixおよびLinuxシステム管理ハンドブック

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

10
tidbeck

提供された答えのどれも私のために一般に働かない。

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
2
user680341