我有一个名为fold.txt
.每行都有两个值,并用空格分隔。如果我说第一个值代表 A 列,空格后的第二个值代表 B 列,那么如何将 A 列的所有值和 B 列的所有值相加,并分别显示每列的总和?
我期待这样的事情:
$ cat fold.txt
100 500
200 300
700 100
输出:
Total count Column A = 1000
Total count column B = 900
答案1
和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
在awk语言是用于文本处理目的的工具,$1
表示第一列的值,$2
表示第二列的值,$3
第三列等,一个特殊的一个NF
是表示最后一列的 ID,相应地也是最后一列的值(因此您可以将上面$NF
替换为也是;是的,当是最后一列 Id 时,您会捕获它,因此变量的值告诉您有多少列(每行 awk 的值更新是从输入中读取的)。$2
$NF
NF
为了处理输入文件为空但仍获得数字输出的边缘情况,我们在结果中添加 0 强制awk
输出数字结果。
列(或字段)awk
由FS
变量(F伊尔德Separator),默认使用空格/制表符。如果您希望按不同字符拆分列,可以使用以下-F
选项重新定义它:awk
awk -F'<character-here>' '...' infile
或在BEGIN{...}
块内,如FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
例如,对于如下所示的输入文件(现在是逗号而不是空格):
100,500
200,300
700,100
你可以编写你的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
或者在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
有点复杂,总结一下氮以下示例中输入文件的列:
100,500,140,400
200,300,640,200
700,100,400,130
所以我们在第一段中讨论了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
这里唯一的新东西是我们使用awk
数组来寻址同一列 Id,从 的值中获取i
并将它们的值添加$i
到该数组中(该数组的索引/键是列 Id);然后在该END{...}
块中,我们在看到的键上循环遍历数组,然后首先打印列 Id,然后打印旁边的列的总和,您将看到如下输出:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
答案2
这对dc来说是一份好工作。
dc 首先读取fold.txt 中的数据,然后读取sum_col_dc 中的代码。
像这样使用它:dc Fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
更多细节:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
享受dc
更多按需解释。