web-dev-qa-db-ja.com

Unixソートで複数のキーをソートする

1-nキーでソートする必要がある潜在的に大きなファイルがあります。これらのキーの一部は数値であり、一部はそうでない場合があります。これは固定幅のカラムナーファイルであるため、区切り文字はありません。

Unixソートでこれを行う良い方法はありますか? 1つのキーで、「-n」を使用するのと同じくらい簡単です。私はmanページを読んでGoogleを簡単に検索しましたが、良い例が見つかりませんでした。これを達成するにはどうすればよいですか?

注:ファイルサイズの可能性があるため、Perlを除外しました。最後の手段になります。

128

-kオプション(または--key=POS1[,POS2])を使用します。複数回表示でき、各キーにはグローバルオプション(数値ソートのnなど)を含めることができます

68
Ken Gentle

ただし注意してください:

ファイルを主にフィールド3でソートし、次にフィールド2でソートする場合、これは望ましくありません。

sort -k 3 -k 2 < inputfile

代わりにこれが必要です:

sort -k 3,3 -k 2,2 < inputfile

最初のものは、フィールド3の先頭から行の末尾までの文字列でファイルをソートします(潜在的に一意です)。

-k, --key=POS1[,POS2]     start a key at POS1 (Origin 1), end it at POS2
                          (default end of line)
298
andras

-kオプションが必要です。

-k 1.4,1.5n -k 1.14,1.15n

最初のフィールドで文字位置4〜5(固定幅の場合はすべて1つのフィールド)を使用し、最初のキーとして数値的に並べ替えます。

2番目のキーも、最初のフィールドの14〜15文字です。

(編集)

例(私が持っているのはDOS/cygwinだけです):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r

データの場合:

12/10/2008  01:10 PM         1,564,990 outfile.txt

ディレクトリ番号を月の番号(位置4〜5)でソートし、次にファイル名(位置40〜60)で逆順にソートします。タブがないため、並べ替えるのはすべてフィールド1です。

92
Clinton Pierce

これは、csvファイル内のさまざまな列を数値および辞書順、列5以降は辞書順でソートするものです。

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d  sort.csv
1,10,b,22,Ga
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C

~/test>cat sort.csv
2,3,a,9,C
2,2,b,20,F
2,2,c,19,Gb,hj
2,2,c,19,Gb,hi
2,2,c,19,Ga
2,2,b,22,Ga
1,10,b,22,Ga

-k1,1nは、列1で始まり列1で終わる数値を意味することに注意してください。

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d  sort.csv
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
1,10,b,22,Ga
21
edW

私はあなたの場合のようなものを信じています

sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile

より良く機能します。 @はフィールド区切り文字です。どこにも表示されない文字であることを確認してください。入力は1つの列で構成されると見なされます。

編集:明らかにclintpはすでに同様の答えを出しました、ごめんなさい。彼が指摘するように、フラグ「n」と「r」は、すべての-k ....オプションに追加できます。

11
Dong Hoon

-sスイッチを使用してソートを安定させることも望ましい場合があります。これにより、均等にランク付けされた行は出力でも元の相対的な順序を維持します。

5
ron

Sortを使用する場合、キー比較の順序に影響するロケールに注意してください。通常、LC_ALL = Cを明示的に使用して、希望するロケールを作成します。

2
jianpx