foo.txt
:
1 10 11
2 20 22
3 30 32
4 40 42
5 50 52
6 60 62
7 70 72
8 80 82
9 90 92
10 100 110
期待するOut.txt
:
1 10 11
2 20 22
3 30 32
4 40 42
5 50 52
6 60 62
7 70 72
8 80 82
9 90 92
10 100 110
25 250 275 #Line 11
30 300 330 #Line 12
45 550 595 #Line 13
11行は1行から始まり1、2、3列の交互行の合計であり、12行は2行の合計で始まる1、2、3列の交互行の合計です。 13行は11行と12行の列を合わせたものです。 KSHとSolaris 5.10を使用していますが、入力ファイルの値が連続しない場合もあり、3桁の整数を超えない場合もあります。私の入力ファイルには10行しかありません。この目標を達成する方法は?
ベストアンサー1
$ awk -v OFS='\t' '{for (i=1;i<=NF;i++) {s[2-NR%2,i]+=$i;s[3,i]+=$i;};$1=$1;print} END{for (n=1;n<=3;n++) print s[n,1],s[n,2],s[n,3]}' foo.txt
1 10 11
2 20 22
3 30 32
4 40 42
5 50 52
6 60 62
7 70 72
8 80 82
9 90 92
10 100 110
25 250 259
30 300 318
55 550 577
上記はGNU awkとLinuxでテストされました。
どのように動作しますか?
-v OFS='\t'
オプション:出力をタブ区切りに設定します。
{for (i=1;i<=NF;i++) {s[2-NR%2,i]+=$i;s[3,i]+=$i;}; $1=$1; print}
これは各列を繰り返してその値を配列に追加します
s
。各列にi
偶数行が追加され、s[2,i]
奇数行が追加されますs[1,i]
。すべての行の列i
がに追加されますs[3,i]
。その後、ラインを印刷します。
END{for (n=1;n<=3;n++) print s[n,1],s[n,2],s[n,3]}
ファイルの終わりに達すると、結果が印刷されます。まず、奇数行を印刷し()、
n=1
偶数行を印刷してから(n=2
)、最後に合計を印刷します(n=3
)。
サン/ソラリス
Sun/Solaris のデフォルト awk に問題があるという報告を何度も受けました。試してみてください:
nawk -v OFS='\t' '{for (i=1;i<=NF;i++) {s[2-NR%2,i]+=$i;s[3,i]+=$i;};$1=$1;print} END{for (n=1;n<=3;n++) print s[n,1],s[n,2],s[n,3]}' foo.txt
または:
/usr/xpg4/bin/awk -v OFS='\t' '{for (i=1;i<=NF;i++) {s[2-NR%2,i]+=$i;s[3,i]+=$i;};$1=$1;print} END{for (n=1;n<=3;n++) print s[n,1],s[n,2],s[n,3]}' foo.txt
または:
/usr/xpg6/bin/awk -v OFS='\t' '{for (i=1;i<=NF;i++) {s[2-NR%2,i]+=$i;s[3,i]+=$i;};$1=$1;print} END{for (n=1;n<=3;n++) print s[n,1],s[n,2],s[n,3]}' foo.txt