アルファベット順に並べ替えたい非常に大きなファイルがあります。タブで区切られたファイルですが、ファイルが空白であるか他の文字であっても、行の最初の文字から始めてソートされていることを確認する必要があります。
入力ファイルの例:
2090802 V19 I must be the third in the group
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V17 I must be the second in the group
2090802 V16 I must be the first in the group of 2090802
コマンドを使用すると、sort test.txt > test-s.txt
次のような結果が出力されます。
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V19 I must be the third in the group
ソーターは、最初の列の値が等しく(3行の空白を無視して)、次の列(V16、V17、V18、およびV19)を使用してファイルをソートするようです。
しかし、私はその値が20908 02
区別されると見なされることを望み、予想される結果は次のようになります。
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
2090802 V19 I must be the third in the group
-b
パラメータを使用して別の区切り文字を指定してみましたが、-t
それでも目的の結果が得られませんでした。
スペースを無視せずに行のすべての文字を考慮してファイルを並べ替える方法は?
答え1
ソートの順序はロケールによって異なります。ほとんどのロケールでは、最初の近似では間隔が無視されます(IGNORE
最初の3つの重みでSPACE(U + 0020)とTAB(U + 0009)を参照)ISO1465)。
各文字(実際にはバイト)を計算し、バイト値のソート順序に従って順序を指定したい場合(UTF-8でエンコードされたテキストの場合、これはUnicodeコードポイント値による順序と一致します)、C
別名POSIX
領域設定使用してください。
LC_ALL=C sort your-file
LC_ALL
影響力の設定みんなローカライズカテゴリ。ソート順序はカテゴリの影響を受けますが、LC_COLLATE
ここではすべてのバイトシーケンスを文字でデコードし、値で(バイト単位で)ソートできるようにするので、設定LC_CTYPE
(文字とバイトシーケンスがエンコード/デコードされる方法に影響を与えます)お勧めC
します。 。他の方法を設定してもLC_COLLATE=C sort your-file
機能しません。LC_ALL
答え2
を使用する方が高速で効率的ですが、もう1つのオプションはTellをLC_ALL=C
使用して最初のフィールドだけを並べ替え、他のフィールドは並べ替えないことです。-k
sort
$ sort -k1,1 file
20908 02 V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group
2090802 V19 I must be the third in the group