添加由空格分隔的 A 列和 B 列的值列表并显示求和结果

mht*_*que -2 awk text-processing

我有一个名为fold.txt. 它在每行中有两个值,由空格分隔。如果我说第一个值代表 A 列,空格后的第二个值是 B 列,那么如何将 A 列的所有值和 B 列的所有值相加并分别显示每列的总和?

我期待这样的事情:

$ cat fold.txt
100 500
200 300
700 100
Run Code Online (Sandbox Code Playgroud)

输出:

Total count Column A = 1000
Total count column B = 900
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 5

awk

awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile
Run Code Online (Sandbox Code Playgroud)

语言中,这是一种用于文本处理目的的工具,$1表示第一列的值,$2表示第二列的值,$3第三列的值等等,一个特殊NF的表示最后一列 Id,因此$NF是最后一列的值(因此您可以替换$2上面$NF也有;是的,您NF在最后一列 Id时捕获它,因此变量的值告诉您您有多少列(从输入中读取每行 awk 的值更新))。

为了处理输入文件为空并仍然获得数字输出的边缘情况,我们将 0 添加到结果中,强制awk输出数字结果。

列(或场)中awk由所述区分FS可变(˚F eild小号eparator),该缺省值是使用空间/标签。如果您希望将列拆分为不同的字符,则可以使用以下-F选项重新定义它awk

awk -F'<character-here>' '...' infile
Run Code Online (Sandbox Code Playgroud)

或在BEGIN{...}块内,如FS

awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
Run Code Online (Sandbox Code Playgroud)

例如对于像下面这样的输入文件(现在是逗号而不是空格):

100,500
200,300
700,100
Run Code Online (Sandbox Code Playgroud)

你可以写你的awk代码如下:

awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile
Run Code Online (Sandbox Code Playgroud)

或在BEGIN块内:

awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile
Run Code Online (Sandbox Code Playgroud)

有点复杂,并在以下示例中对输入文件的所有N列求和:

100,500,140,400
200,300,640,200
700,100,400,130
Run Code Online (Sandbox Code Playgroud)

所以我们NF在第一段中谈到(NF 值是告诉你你有多少列(每行更新)):

awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) { 
         printf ("Total count Column: %d= %d\n", colId, sum[colId] );
     };
}' infile
Run Code Online (Sandbox Code Playgroud)

这里唯一的新东西是我们使用awk数组来寻址从 的值中获取的相同列 Idi并将它们的值添加$i到该数组中(该数组的索引/键是列 Id);然后在END{...}块中,我们在它看到的键上循环我们的数组,然后首先打印列 Id,然后打印旁边的列的总和,您将看到如下输出:

Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
Run Code Online (Sandbox Code Playgroud)