+、 - などの特殊文字の並べ替え

+、 - などの特殊文字の並べ替え

複数の行と列で構成されるファイルがあります。列は\ tで区切られます。今度は、2番目の列に基づいてファイルをソートしたいと思います。たとえば、次のようにsort -f -t$'\t' -k2 file.txtできます。しかし、2番目の列には+o-+上、o中、下を-揃える方法は?

また、列5という別の列があり、その列のファイルをソートしようとしています。ただし、n上、s中、下の順に個人順を指定したいと思いますl

私の目標を効果的に達成できるプログラムがある場合は、このソリューションをお勧めします。それ以外の場合は、自己作成機能を探しています。

答え1

DSU、デコレーション-アライメント-脾臓式、またはシュワルツ変換という技術があります。

基本的なアプローチは、データの組み合わせになることができる独自の代理キーを作成することです(レコードのすべての部分から抽出され、他のフィールドによって異なります)。これらは、必要な重要度順にランク付けするだけです。たとえば、数値フィールドをゼロで埋めることが役に立つことがよくあります。入力行番号を最終子として追加して、最終注文を確実に作成できます。全キー長はすべてのレコードで同じでなければなりません。

その後、-k1.1の順序(レコード全体)に従ってソートされます。通常、ソートは各比較に対して 2 つのマルチキーを書き換えるため、通常はマルチキーソートよりも高速です。

最後に、固定長装飾を切り、装飾アライメントの出力をキャンセルします。

答え2

sort大容量ファイルの場合は引き続き使用できます。

#!/usr/bin/env bash

perl -F'\t' -ne '{$F[1] =~ s/o/,/; $F[4] =~ s/l/t/; print join "\t",@F}' file|\
sort -t $'\t' -k 2,2 -k 5,5 |\
perl -F'\t' -ne '{$F[1] =~ s/,/o/; $F[4] =~ s/t/l/; print join "\t",@F}'

最初の Perl スクリプトは、ソートを準備するためにo2,番目と 5 番目のl列を変更します。t

2番目のPerlスクリプトが再び変更されます。

関連情報