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)
与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)
在awk语言中,这是一种用于文本处理目的的工具,$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)