複数のファイルの並べ替えとマージ

複数のファイルの並べ替えとマージ

複数のテキストファイルを逆順に並べ替えてから、マージ/キャットを1つのテキストファイルにしたいと思います。

a.txt

0   33.1
2   33.0
10  21.1
20  21.8

b.txt

0   30.1
2   33.0
10  28.1
20  27.8

*.txtファイルを待っています

私はこの出力が欲しい

20  21.8
10  21.1
2   33.0
0   33.1
20  27.8
10  28.1
2   33.0
0   30.1

私はこれが嫌いです。

20  21.8
20  27.8
10  21.1
10  28.1
2   33.0
2   33.0
0   33.1
0   30.1

私はこのコードを試しました

for file in *.txt ; do 
   sort -nrk 1,1 *.txt > "$file" ; 
done

私も試しました

sort -m *.txt

しかし、このコードの出力は私が望むものではありません。

sort merge paste cat他の関連オプションを使用してソリューションを探しています。

助けてくれてありがとう。

答え1

ファイルを個別にソートし、出力全体を結果ファイルにリダイレクトします。

for file in *.txt ; do 
   sort -k1,1rn < "$file"
done > file.concatenated

.txt(ここで重要なのは、出力ファイルがリダイレクトを介して最初に作成されるため、拡張子がないことです。)

または、ファイルをその場所で並べ替えたい場合(自分で並べ替えるには上書き):

set -- *.txt
ok=true
for file do
  sort -o "$file" -k1,1rn -- "$file" || ok=false
done
"$ok" && cat -- "$@" > file.concatenated

この2段階のアプローチを使用すると、リンクファイルを作成する前にファイル順序の問題を検出できます。

.txtループを通過するたびにファイル全体のリストを渡すため、最初のループは機能しません。

sort -mすでにソートされたファイルをソートされた出力にマージします。これはあなたが望むものとは反対です。まだソートされていないファイルをソートし、ソートされた出力にマージせずに結果のみをリンクしようとしています。

ここでは、ファイルが順方向に並んでいるように見えます。これが常に真であると信じられる場合は、それを反転できる必要があり、これはソートを反転するよりも効率的です。

GNU システムには、そのためのtacコマンドと他の多くのコマンドがありますtail -r(ただし、一部の実装ではファイル引数のみを使用するため、これを使用して繰り返す必要があります)。

tac -- *.txt > file.concatenated

また、これは-k1,1rn関係を解決するときと同じではありません。-rnk1,12行が等しいかどうかを比較すると、行全体sortが語彙的に比較されます(ここで同じように比較されますが、1 a以前は語彙的に比較されます)。1 b-k1,1n1 a1 b

この-rオプションを使用すると、最終比較は逆の順序で実行されます。これはr、主な仕様の1つにフラグを追加する場合には適用されません。

GNUは、同じ比較行の元の順序を維持するために最終比較を無効にするsort必要があります。-s

関連情報