GNUソートを使用して単一のキーでソートする/他のキーの不要なソートを防止する


9

すでに順序付けられたデータを含むファイルがあり、他のキーのデータの順序を壊すことなく、1つのキーの値に従ってファイルを再順序付けしたいです。

指定していないキーの値に基づいてGNUソートが行のソートを実行しないようにするにはどうすればよいですか?またはソート時にキーの範囲を無視するようにGNUソートに指定するにはどうすればよいですか?

ファイルdata.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

予想される出力:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

コマンド:

sort -k 1,1 <data.txt

結果:要求しなかった不要な並べ替え:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

回答:


21

安定したソートが必要です。からman sort

-s, --stable
       stabilize sort by disabling last-resort comparison

つまり:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

-nまたは--numeric-sort、キーが数値の場合も必要になることに注意してください(たとえば、10と2をデフォルトの-字句-ソート順で比較すると、予期しない結果が生じる場合があります)。その場合、それはただ行うことの問題です:

sort -sn <data.txt

行全体の数値の解釈は最初のフィールドの解釈と同じになるため、最初のフィールドを抽出する必要はありません。



私はドキュメントを読みましたが、「安定」の適切な定義は私の注意を回避しました。迅速かつ簡潔で、よく引用されている回答に感謝します。実際のデータの最初のキーはローカライズされた文字列なので、数値は機能しません。
Wil

4

オプションsortを持たない(GNU以外の)実装では、-sいつでも次のことができます。

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

つまり、行番号を先頭に追加して2番目のソートキーにし、その後でそれを取り除きます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.