「すべてのフィールド」アルファベット順に並べ替え

「すべてのフィールド」アルファベット順に並べ替え

以下は、ポイントを説明するための非常に単純な(人為的ですが)例です。/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番目のフィールドをソートしています。

おすすめ記事