sed または nawk を使用した列の代替値の合計の計算

sed または nawk を使用した列の代替値の合計の計算

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 

おすすめ記事