bugfix> linux > 投稿

複数のテキストファイルを逆の順序で並べ替えてから、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 (ただし、一部の実装ではファイル引数を1つしか取らないため、それらをループする必要がある場合があります)。

    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 同等に比較する行の元の順序を保持する最後の手段の比較を無効にします。

あなたの答え