複数のテキストファイルを逆順に並べ替えてから、マージ/キャットを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,1
2行が等しいかどうかを比較すると、行全体sort
が語彙的に比較されます(ここで同じように比較されますが、1 a
以前は語彙的に比較されます)。1 b
-k1,1n
1 a
1 b
この-r
オプションを使用すると、最終比較は逆の順序で実行されます。これはr
、主な仕様の1つにフラグを追加する場合には適用されません。
GNUは、同じ比較行の元の順序を維持するために最終比較を無効にするsort
必要があります。-s