並べ替えコマンドの動作が間違っていますか?


14

Ubuntuデスクトップ14.04(Trusty Tahr)でファイルのコンテンツをソートしようとしました。私の場合、期待される結果は元のコンテンツと同じであるはずですが、実際の結果はそうではありません。どうして?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

4
無駄な使用のcatために小さな賞トロフィーを渡します。
デビッドフォースター

3
@DavidFoersterのコメントに、置き換えることができることを指摘する面白い方法であるcat test.txt | sortことでsort test.txt:)
フォルカー・シーゲル

@VolkerSiegel:確かにcat、開始に使用する便利な定式化があります。たとえばcat FILE | grep dev | sort、「dev」が含まれる行のみをソート順に表示します。を使用sort FILE | grep devすると、同じ出力が生成されますが、色が付いています。
AlainD

回答:


17

LC_ALL変数を使用して、LC_ALL=C呼び出す前に設定することができますsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

魔法のようにこれが何であるか知りたいなら、この答えを読んでくださいLC_ALL=C。ここに短い要約があります:

Cロケールは、最も単純なロケールを意味する特別なロケールです。また、他のロケールは人間向けですが、Cロケールはコンピューター向けです。Cロケールでは、文字は1バイト、文字セットはASCII、ソート順はバイト値に基づきます。

また、@ KenMollerupが指摘したように、 man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

したがって、sortをとともに使用する場合LC_ALL=C、sortはシンボルをバイト単位で比較します。それ以外の場合、sort英数字以外の文字はすべて無視されます。


申し訳ありませんがこれを見ていませんでした、私はコメントに反応しました!
ケンMollerup

@KenMollerupを指してくれてありがとうman sort。私はそれに気づかなかった
c0rp

8

ソートでは、アルファベット順および数値ソートを使用します。私たちと同様に、+-<> ...などの特殊文字は無視され、数値は数値として扱われます。

リストはaa、ab、ab、ac、acのように表示されます


test.txtが希望の方法でソートするような特殊文字を無視しないように、ソートのオプションはありますか?
ダグスミティーズ

6
man sortでこれを参照してください:***警告***環境によって指定されたロケールは、ソート順に影響します。LC_ALL = Cを設定して、ネイティブのバイト値を使用する従来のソート順を取得します。
ケンMollerup

@KenMollerup、回答にさらに情報を追加してください。からの引用を追加しman sort、例を追加します。
c0rp

はい、でも私は遅すぎました。以下のc0rpの答えをご覧ください。
ケンMollerup
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.