UNIXで1列のみでソートするにはどうすればよいですか?


47

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コマンドで可能ですか?

回答:


64

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

sort -s -n -k 1,1

-s指定されたキーの一部ではありませんでしたすべてのものに区分する区分無効「最後の手段」、。

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


あなたが正しいです。これはまさに私が必要としたものです。ありがとう!

この種の出力で結合を使用することは可能ですか?
MiNdFrEaK

@MiNdFrEaK:の要件joinは、参加しているフィールドで入力をソートすることです。確かに、この出力は最初のフィールドでソートされており、あなたはそれに参加できます。
カスカベル

2つのファイルがあり、1つは2列、もう1つは1列です。2番目のファイルは、sort -uを使用してソートされます。さて、タスクは、この列を最初のファイルの最初の列と結合する必要がありますが、ソートされていないので、構文はどうなりますか?これは機能しますか?join -j 1 file2.txt sort -s -n -k 1 file1.txt?
MiNdFrEaK

1
-k 1,1(「1」の部分)私のために任意のより良い動作しません。必要な場合は-s -k 1、何が機能し-nますか?
トーター

10

最初の列でのみソートするには、次を実行する必要があります。

sort -n -s -k1,1

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

sortはキー仕様-k3(-k3,3ではなく)を受け入れますが、おそらく期待どおりには動作しません。終了フィールド番号がない場合、ソートキーは行末まで続きます


私のために働いていない、私は-sカスカベルが指摘したようにオプションを追加する必要があります。
ジャンポール

@JeanPaulあなたは正しい、-s「このオプションは、等しいキーを持つレコードの元のレコード順序を維持します」というドキュメントです。
tidbeck

2

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

両方で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

sort -s -k2,2 file1
plhn

Cascabelによって提案された答えは有効ですが、それを読み間違えたと思います。
ジャンポール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.