
以下は、ポイントを説明するための非常に単純な(人為的ですが)例です。/tmp/table
次の内容を含むファイルがあるとします。
px9xc
px12xc
pqx12xc
pqx9xc
ここでのx
役割はフィールド区切り記号。したがって、ファイルには4行と3列のテーブルが含まれます。 (これからこの列を「フィールド」と呼びます。)
このテーブルをフィールドに基づいてアルファベット順にソートしたいと思います。私は、2行のフィールド1に同じ値がある場合はフィールド2を基準に並べ替えて同点を区別し、フィールド2の値も同じ場合はフィールド3を基準に並べ替えるということです。1 注:以内にsort
各フィールドに対してデフォルトの順序を想定します。
つまり、 のテーブルに/tmp/table
必要なソートは次のとおりです。
px12xc
px9xc
pqx12xc
pqx9xc
sort
(基本シーケンスでは、が12
前に来ます9
。)
フィールド区切り文字は次のように解釈されないため、単純な呼び出しでは目的のsort
ソートは生成されません。
% sort /tmp/table
pqx12xc
pqx9xc
px12xc
px9xc
さらに、所望のソートは生成されない。
% sort -tx -k1,3 /tmp/table
pqx12xc
pqx9xc
px12xc
px9xc
sort
(少なくとも私のシステムにインストールされているもの、つまりGNU)を使用して目的のソートを達成するために見つけた唯一の方法は次のとおりです。
% sort -tx -k1,1 -k2,2 -k3,3 /tmp/table
px12xc
px9xc
pqx12xc
pqx9xc
このソリューションの問題(フィールド数と同じくらい多くのオプションを指定する退屈に加えて-k?,?
)は、フィールド数が他のテーブルに一般化されていないことです。
sort
「すべてのフィールド」にフィールドベースの事前編成順序を適用する便利な方法はありますか?
1より一般的にテーブルに次のものがある場合窒素フィールドでアルファベット順に2行のどちらが最初に出現するかを決定するには、次の再帰規則を適用します。K範囲は1から窒素: 2行のフィールド1の値が等しい場合K - 1 の場合は、次の値で動点が決まります。K- 番目のフィールド。
答え1
区切り文字を「ネイティブ」ソートが機能することを可能にする別の区切り文字(NUL文字など)にだまされ、置き換えてからリセットできます。
例えば
tr x '\000' < file.txt | sort | tr '\000' x
これで、ソートに対するロケールの影響を知る必要があるため、次のことができます。
tr x '\000' < file.txt | LANG=C sort | tr '\000' x
この方法は、データにNULが含まれていない場合にのみ機能します!
書式付きテーブルを使用すると、これがどのように機能するかを簡単に説明できます。
2行を比較する必要があります。
ab | def
abc | def
ab<NUL>def
区切り記号をNULに設定しますabc<NUL>def
。<NUL>
前に現れたc
ので、最初のフィールドを正しくソートしました。
ここで、最初のフィールドが一致し、2番目のフィールドが異なると仮定します。
abc | def
abc | ghi
abc<NUL>def
それでは比較してみましょうabc<NUL>ghi
。最初のフィールドと区切り文字に一致する項目が見つかりました。2番目のフィールドをソートしています。