複数の行と列で構成されるファイルがあります。列は\ 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 スクリプトは、ソートを準備するためにo
2,
番目と 5 番目のl
列を変更します。t
2番目のPerlスクリプトが再び変更されます。