私は、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
コマンドで可能ですか?
これを試してみてください。
sort -s -n -k 1,1
-s
は 'last-resort'ソートを無効にします。これは指定されたキーの一部ではなかった全てをソートします。
-k 1
は、2列目でソートしようとした場合にわかるように、実際には数値ソートのコンテキストでは「このフィールドと以下のすべて」を意味するものではありません。あなたは単に関係の残りの部分に行くことによって関係が壊れているのを見ています。ただし一般的には、フィールド1でソートのみするには-k 1,1
を指定する必要があります。
最初の列のみをソートするには、次のようにします。
sort -n -s -k1,1
sortはキー指定-k3(-k3,3ではなく)を受け入れますが、おそらくあなたが期待することをしないでしょう。終了フィールド番号がないと、ソートキーは行末まで続きます。
提供された答えのどれも私のために一般に働かない。
sort -s -k 2 file1
とsort -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