内容に関係なく、ファイルを行ごとに並べ替えます。

内容に関係なく、ファイルを行ごとに並べ替えます。

アルファベット順に並べ替えたい非常に大きなファイルがあります。タブで区切られたファイルですが、ファイルが空白であるか他の文字であっても、行の最初の文字から始めてソートされていることを確認する必要があります。

入力ファイルの例:

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使用して最初のフィールドだけを並べ替え、他のフィールドは並べ替えないことです。-ksort

$ 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 

関連情報