2009-09-25 21 views
5

私は、コマンドの結果に多くのファイルがあります。 uniqの-c some_file>たとえばマージ結果-c

some_file.out: 1.out:

 
1 a 
2 b 
4 c 

2.out

 
2 b 
8 c 

私は、これらの結果をマージしたいので、私は得る:

 
1 a 
4 b 
12 c 

ソートまたはユニックで処理できると思っていましたが、関連するオプションはありません。 ruby​​/perlスクリプトを書くことは一つの方法ですが、core * nixコマンド(sortやuniqなど)を使って簡単にやりたいと思います。

編集: 明確になります。私は元のファイルがなく、* .outファイルをマージしなければなりません。

ありがとうございました!

+0

私は、join、awk、exprだけの解決策があるはずだと思います。 –

答えて

3

awkでそれを試してみてください。

awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' 1.out 2.out 
+0

それは私のために働くはずです。私はO(N)のメモリ使用量を期待しているので理想的ではありません。ここでNはファイルの数ですが、大きな結果が出ない限りしばらく時間がかかります。ありがとう! – radarek

+0

'awk'はすべてのファイルを一度に1行ずつ順番に読み込み、' count'配列(ハッシュテーブル?)だけをメモリに保存すればよいので、ファイル数が線形ではないと思います。 – Philipp

+0

私はPhilippによって与えられた解が線形であるとは言いませんでした。私はそれがそのような解決策を書くことができると言った。 – radarek

0

それはどんなツールがデフォルトでこれを行いますそうですので、それは、かなり具体的な問題です。あなたはスクリプト言語(どんなshであっても)で実装された、十分な小さなループ(awk nastynessは不要)でスクリプトを書くことができます。私は別の方法があるとは思わない。

0

これはあまり重大ではありませんが、動作します。私はPhilippsのソリューションが好きです。

cat 1.out 2.out | 
{ 
    while read line; do 
     for i in $(seq ${line% *}); do 
      echo ${line#* } 
     done 
    done 
} | sort | uniq -c 
関連する問題