awkで2つのファイルの要素を算術計算して,出力することはできますか?
具体的には
1 2 3
4 5 6
というファイルと(実際はもっと行列とも数が多い)
3 4 5
6 7 8
というファイルの各要素を足して(あるいは四則演算して)
4 6 8
10 12 14
というようなファイルに出力したいのです.
よろしくお願いします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
とくにこだわりがないのなら Python とか使った方がラクな気がします。
2021/09/03 04:23
画像ファイルの演算なら、imagemagickを使うのが手っ取り早い気がします。
回答3件
0
ベストアンサー
スクリプトを作ってみました。
ファイルの行数,列数が違っている場合は少ない方に0が入っていると見なして加算するような動作になります。
ファイルが3個以上ある場合でも、すべてのファイルについて行と列をそのまま足していくような動作になります。
awk
1{ 2 # v[行,列] にデータを加算していく 3 for(x=1;x<=NF;++x){ 4 v[FNR,x]+=$x 5 } 6 # 行ごとの最大列を調べておく 7 if(fields[FNR]<NF){ 8 fields[FNR]=NF 9 } 10 # 最大行を調べておく 11 if(lines<FNR){ 12 lines=FNR 13 } 14} 15END{ 16 # 最後に結果を出力する 17 for(y=1;y<=lines;++y){ 18 for(x=1;x<=fields[y];++x){ 19 printf v[y,x] " " 20 } 21 print "" 22 } 23}
実行結果です。
terminal
1$ cat plus.awk 2{ 3 # v[行,列] にデータを加算していく 4 for(x=1;x<=NF;++x){ 5 v[FNR,x]+=$x 6 } 7 # 行ごとの最大列を調べておく 8 if(fields[FNR]<NF){ 9 fields[FNR]=NF 10 } 11 # 最大行を調べておく 12 if(lines<FNR){ 13 lines=FNR 14 } 15} 16END{ 17 # 最後に結果を出力する 18 for(y=1;y<=lines;++y){ 19 for(x=1;x<=fields[y];++x){ 20 printf v[y,x] " " 21 } 22 print "" 23 } 24} 25 26$ cat 1.txt 271 2 3 284 5 6 29 30$ cat 2.txt 313 4 5 326 7 8 33 34$ cat 3.txt 3510 20 30 40 3650 60 70 3780 90 38 39$ awk -f plus.awk 1.txt 2.txt 404 6 8 4110 12 14 42 43$ awk -f plus.awk 1.txt 2.txt 3.txt 4414 26 38 40 4560 72 84 4680 90
投稿2021/09/02 09:08
総合スコア1248
0
両ファイルの列数が完全に同じであったとして、
awk
1# test.awk 2NR==1{ 3 n=NF/2 4} 5{ 6 for(i=1; i<n; i++){ 7 j=i+n 8 printf "%d%s", $i+$j, OFS 9 } 10 print $i+$NF 11}
$ paste a.txt b.txt |awk -f test.awk
投稿2021/09/02 08:22
総合スコア13692
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。