我有两列文件,第一列排序,这样
0 107
1 1
1 141
2 22
3 1
3 222
4 65
5 1
5 53
6 79
我想要第一列中没有重复条目的输出,第二列是重复的第一列值的第二列旧值的总和。我的尝试:awk '$1 != p{ if (NR>1) print p, s; p=$1; s=0} {s+=$2} END{print p, s}'
,输出
107
1 142
2 22
3 223
4 65
5 54
6 79
即0
不显示第一行第一列的值。我错过了什么?首选单线解决方案。
首先,我建议将 if 子句操作括在括号中。例如,下面很明显 if 子句仅适用于
{print p,s}
,而不适用于p=$1
ands=0
:不过,那是表面上的,但不是错误。
您的错误在于没有注意到未设置的变量在比较中既被视为又被视为
0
空字符串。对于文件的第一行,$1=0
. 因此,第一$1!=p
行为假(因为p
未设置),这意味着p
当 awk 开始读取第二行时仍未设置。一个可能的解决方案是
p
在程序开始时设置为空字符串:现在,第一行的
$1!=p
比较是正确的,因为0!=""
.输出:
尝试:
这个怎么运作
每当我们到达序列末尾时
$1 != p && NR>1
,我们都会打印p, s
并重置s
为零。对于每一行,我们设置
p
为第一列,并增加s
第二列。在最后一行之后,我们打印
p, s
.