"uniq -c"結果を追加し、ループで上書きし続ける方法は?

シェルスクリプトを作成していますが、一意の値の結果とその数を一度に1つのファイルにマージしたいと思います。たとえば、次の2つのファイルからデータを読み取る場合(最初の列の数字は一意の数です):

最初のループはデータを読み込みます。

3 Dog   
1 Cat   
5 Horse

2番目のループでデータを読み取る

1 Dog  
3 Cat  
1 Horse  
2 Goat 

私の「カウントファイル」を次のように上書きするように、2番目と1番目のファイルをマージしたいと思います。

2番目のループが完了した後の結果ファイル

4 Dog  
4 Cat  
6 Horse  
2 Goat 

データセットが大きく、ファイルをダウンロードするよりもファイルを読み取って削除する方が良いので、これを実行しようとしています(またはファイルがかなり長いため、catファイルをまとめて最後に見つけること)。uniq -cこれを行う方法はありますか?ありがとうございます!

ベストアンサー1

この方法は、一時awkファイルtallytmpと名前付きの単純な実行回数を合計するために使用されますtallysort2番目のフィールド(-k2)に2つのカウントファイルをまとめました。

tally開始するには空のファイルが必要なので、touch tally繰り返しごとに次のことが行われます。

uniq -c file > tallytmp
sort -k2 tally tallytmp \
  |awk '{
          if($2==prev){
            tot+=$1
          }else{
            print tot,prev;
            tot=$1;pc=$1;prev=$2
          }
        }END{
          print tot,prev
        }' > tallyresult
cp tallyresult tally

(続けてawkスクリプトを1行に入れてください.)

sort|awk論理的にパイプを直接リダイレクトできるはずですtallyが、sortそれでも使用するため、tallyresult結果ファイルにコピーする前に2番目の一時ファイルが必要ですtally

与えられた2つの反復の出力は実際には次のようになります。

[blank line]
4 Cat
4 Dog
2 Goat
6 Horse

2番フィールドの順序に基づいて順序が混ざっているのにうまく動作します。私はそれを使っていくつかの繰り返しを実行することができました。

おすすめ記事