2009-07-26 8 views
13

私は2つのLinuxマシンを持っていますが、UNIXソートではその動作が異なるようです。私は下線文字の扱いに絞ったと信じています。アンダースコア文字のUnixソート処理

Iは、TMPは、次の2つの行が含まsort tmp、実行する場合:

aa_d_hh 
aa_dh_ey 

1台のマシン出力

aa_d_hh 
aa_dh_ey 

(すなわち、 '_' 先行 'H')他の出力

しばらく
aa_dh_ey 
aa_d_hh 

(つまり、 'h'が '_'に先行する)。私はこれらのマシンを一緒に動作させる必要があります(私は大量のファイルをマージするためにsort -mを後で使用します)。

強制的に並べ替えを強制する方法はありますか?

ありがとうございました。

+0

両方のマシンでsort --versionを試してみてください。 – sud03r

答えて

15

が含まれますsortコマンドが実行されます。 これと同じ動作をする必要があります。

+0

LC_COLLATEの他の有効な選択肢は何ですか?特に下線を下に移動したいとします。どのような価値がありますか? –

+0

'LC_COLLATE = en_US.ASCII'はもう一つの有効な選択肢で、' C'と同じソート順を持っています。 –

3

ソート順は、環境変数LC _の現在の値に依存します。 'locale'、 'setlocale'などのローカルドキュメントを調べてください。両方のマシンでLC _ COLLATEを 'POSIX'に設定すると、結果が一致するはずです。

+0

私のマシンにはこのような環境変数はありませんが、ソートはうまく動作します。 – sud03r

0

違いはlocaleです。 localeコマンドを使用して、現在の設定を確認します。

LC_COLLATE,LC_TIME、およびLC_MESSAGESなど、さまざまなロケールカテゴリがあります。環境変数LC_ALLまたはLANGを設定するか、環境変数LC_COLLATEを設定して照合(ソート)順序のみを設定することで、すべてを変更できます。ロケールCまたはPOSIXは、標準で定義されている基本ロケールです。

env LC_COLLATE=C sort tmp 

これは、現在の環境に1つだけ変更されません。他の人はあなたがちょうどあなたのコマンドのための伝統的なソート順にLC_COLLATEを設定することができますなどen_US(米国英語)、fr_FR(フランス語)、

0

これは、ロケールの違いが原因と考えられます。 en_US.UTF-8ロケールでは、英数字(_)は文字と数字の後にソートされますが、POSIX C localeでは大文字と数字の後にソートされますが、の前には、の小文字がソートされます。

# won't change LC_COLLATE=C after execution 
$ LC_COLLATE=C sort filename 

あなたはまた、一般的にソート動作の詳細を示すためにsort --debugを使用することができます:あなたは、単一のコマンドのLC_COLLATE=Cを強制的に上記の式を使用することができ、これもthis answerに示す

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=en_US.UTF-8 sort --debug 
sort: using ‘en_US.UTF-8’ sorting rules 
foo0bar 
fooabar 
fooAbar 
foo_bar 

$ (echo 'foo_bar'; echo 'fooAbar'; echo 'foo0bar'; echo 'fooabar') | 
     LC_COLLATE=C sort --debug 
sort: using simple byte comparison 
foo0bar 
fooAbar 
foo_bar 
fooabar 

を、あなたのシェル環境を変更することなく:

関連する問題