「ソート」がアスタリスクのような特殊文字を無視するのはなぜですか?


27

sort共通のプレフィックスを一緒に並べ替えると思いましたが、常にそうなるとは限りません。例として次の入力を取り上げます。

AT0S*eightieths
AT0S*eyetooth's
AT*ad
AT*Ad
AT*AD
AT*Eydie
AT*eyed
ATF*adv
ATF*ATV
ATF*edify
ATF*Ediva
ATFKT*advocate
ATFKTNK*advocating
ATFKT*outfought
ATFKTS*advocates
ATHT*whitehead
ATHT*Whitehead
AT*id
AT*I'd
AT*Ito
AT*IUD
ATJ*adage
ATNXNS*attention's
ATNXNS*attenuation's
ATNXNS*autoignition's
AT*oat
AT*OD
AT*outweigh
AT*owed
ATP0K*idiopathic
ATP*adobe
ATT*wighted
ATT*witted
ATT*wooded
AT*UT
AT*Uta
AT*wowed
AT*Wyatt
ATX*atishoo

後にsort、すべてAT*が1つのチャンクに終わることを期待しますが、このデータを実行するsortと、==入力が出力されます。何故ですか?アルファベット以外の文字などを無視するオプションを指定していません。ただsort dict > out

の私のバージョンsortはから来ていcoreutils 8.5-1ubuntu3ます。


私のために働く。たぶんどこかのエイリアス?
マシューカルティエ

回答:


17
sort --version-sort filename 

これにより、数値の自然な順序が保持されます。


4
+1それは機能しますが、なぜですか?テキストには数桁しかありません。
アーロンディグラ

2
環境を変更する必要なく機能します。+ 1
Meredith

@AaronDigulla:バージョンソートの文字列を物事をソートするためのほとんど最もばかげた方法として扱うので、ロケールを無視し、特別な方法で数字のみを処理すると思われます。
ジョンアイ

23

LC_ALL = Cを設定すると、私の場合は従来のソート順が復元されました。パッケージ:coreutilsバージョン:8.5-1ubuntu3

export LC_ALL=C 

LANG=C動作します。私を困惑させるもの:LANGに設定されていen_US.UTF-8ます。なぜ*特別な扱いを受けているのですか??
アーロンディグラ

2
LC_COLLATE特定のだ設定であるsortなど、
一時停止追って通知があるまでは。

Raspbian // Pixelで私のために働いています...特別な文字を無視するような「迷惑」は私を殺していました...ありがとう。
ZEE

2
exportローカルに設定する必要はなく、場合によっては他の何かを混乱させることもありません sort:の呼び出しで設定するだけですLC_ALL=C sort。たとえばecho -e 'a\n*\n*b\nc' | LC_ALL=C sort、LC_ALLは並べ替えの呼び出し以外では変更されません
ハッシュブラウン

1

(cygwinで)期待どおりに動作します。

sort input > output 結果として

少し
少し
AT * Eydie
AT *
AT * IUD
AT *伊藤
AT * OD
AT * UT
AT *うた
AT *ワイアット
少し
AT * eyed
AT * id
AT *オート
AT * outweigh
AT * owed
AT * wowed
AT0S * eightieths
AT0S * eyetoothの
ATF * ATV
ATF *エディバ
ATF * adv
ATF * edify
ATFKT *提唱者
ATFKT *アウトファイト
ATFKTNK *提唱
ATFKTS *支持者
ATHT *ホワイトヘッド
ATHT *ホワイトヘッド
ATJ * adage
ATNXNS *注意事項
ATNXNS *減衰
ATNXNS *自動点火
ATP * adobe
ATP0K *特発性
ATT *ワイテッド
ATT * witted
ATT * wooded
ATX * atishoo

並べ替えは何かにエイリアスされていますか?試してみる\sort

また

環境で指定されたロケールはソート順に影響します。LC_ALL = Cを設定して、ネイティブのバイト値を使用する従来のソート順を取得します


エイリアスなし。ubuntu / debian固有の機能である必要があります。
アーロンディグラ

1

バージョン:sort(GNU coreutils)8.26

私はそれをインラインで行います:

LANG=C sort FILE

または機能別(元のファイルを変更):

dosort() { local file="$*"; LANG=C sort ${file} -o ${file}.swp; mv ${file}.swp ${file}; cat ${file} ;}

1

他の人のコメントに基づいて簡単な答えを提供するために、それはあなたの環境を変えません:

input_program | LC_COLLATE=C sort | output_program

または

LC_COLLATE=C sort < input_file > output_file

またはその組み合わせ。


0

GNUソートでは、次を使用できます--dictionary-order

NAME
       sort - sort lines of text files

SYNOPSIS
       sort [OPTION]... [FILE]...
       sort [OPTION]... --files0-from=F

DESCRIPTION
       Write sorted concatenation of all FILE(s) to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are mandatory for short options too.  Ordering options:

       -b, --ignore-leading-blanks
              ignore leading blanks

       -d, --dictionary-order
              consider only blanks and alphanumeric characters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.