2010-12-08 8 views
2

私は、次の形式でテーブルのセットを持っている:セル単位の合計

1000 3 0 15 14 
2000 3 0 7 13 
3000 2 3 14 12 
4000 3 1 11 14 
5000 1 1 9 14 
6000 3 1 13 11 
7000 3 0 10 15 

彼らは単純なテキストファイルです。

これらのファイルを同じフォーマットで新しいテーブルにマージしたいと思います。各セル(X、Y)は元のテーブルセットのすべてのセル(X、Y)の合計です。もう少し複雑な要素の1つは、最初の列の数値はラベルであるため、合計しないことです。

これはAWKで行うことができますが、特にこの言語に精通しているわけではなく、Web上で解決策を見つけることができません。誰かが別のツールを提案しても、それは問題ありません。

私はこれをbashシェルスクリプトから実行したいと思います。

+1

予想される出力の例を示してください。 –

+0

各ファイルから、または各ファイルから同じラベルに属する各セルのすべての列を合計しますか?これは理にかなっていますか? :) – jgr

答えて

2

これを試してみてください:このような

#!/usr/bin/awk -f 
{ 
    for (i=2;i<=NF; i++) 
     a[$1,i]+=$i 
    b[$1]=$1 
    if (NF>maxNF) maxNF=NF 
} 

END { 
    n=asort(b,c) 
    for (i=1; i<=n; i++) { 
     printf "%s ", b[c[i]] 
     for (j=2;j<=maxNF;j++) { 
      printf "%d ", a[c[i],j] 
     } 
     print "" 
    } 
} 

が実行それを:

./sumcell.awk table1 table2 table3 

または

./sumcell.awk table* 

二回あなたの例の入力を使用して、出力は次のようになります。

$ ./sumcell.awk table1 table1 
1000 6 0 30 28 
2000 6 0 14 26 
3000 4 6 28 24 
4000 6 2 22 28 
5000 2 2 18 28 
6000 6 2 26 22 
7000 6 0 20 30 
+0

ブロッククォートを使用しますか?私の答えは、見苦しい。 – jgr

+0

@jgr:いいえ、 '010101'ボタンを使うか、4つのスペースを使ってコードをインデントしてください。あなたの投稿を編集して、私がしたことを見てください。 –

+0

ああ、おかげで多くの仲間! – jgr

1

各行を合計します。各行に少なくとも1つの数値列があるとします。

while read line ; do 
    label=($line) 
    printf ${label[0]}' ' ; 
    expr $(
     printf "${label[1]}" 
     for c in "${label[@]:2}" ; do 
      printf ' + '$c 
     done 
    ) 
done < table 

編集:もちろん、ラベルに基づいて結合に関するコメントが表示されなかったので、これは不完全です。

1
perl -anE'$h{$F[0]}[$_]+=$F[$_]for 1..4}{say$_,"@{$h{$_}}"for sort{$a<=>$b}keys%h' file_1 file_2 
関連する問題