我的输入如下:
输入:
FILE1 3 5
FILE2 5 9
FILE3 4 6
FILE1 3 5
FILE1 4 6
FILE1 3 5
FILE2 4 6
FILE3 3 5
FILE1 8 3
FILE5 3 5
所需的输出应如下:
输出:
Name(count) COLUMN1 COLUMN2
FILE1(5) 21 24
FILE2(2) 9 15
FILE3(2) 7 11
FILE5(1) 3 5
输出所需的解释:
计算输入中第1列中每个名称的每次出现次数,然后在输出中使用(COUNT)打印名称
获取每个名称输入的第1列的总和,并在输出通知中显示其名称的总和。
第3列应该是上面的总和以及第2列。
更多解释:
输出显示FILE1,计数为5,因为FILE1在输入中重复5次。
计数5的FILE1的值均为21和24
21来自输入
24来自输入
我尝试使用uniq和for / while进行多次排序,但无法获得所需的输出。
答案 0 :(得分:0)
使用awk,您只需解析一次所有行:
awk '{col1[$1]+=$2; col2[$1]+=$3; names[$1]+=1}
END { for (name in names)
{
printf ("%s(%s) %s %s\n", name, names[name], col1[name], col2[name]);
}
}' inputfile
EDIT
说明:
awk逐行处理输入。从每一行开始使用名称$1
汇总是使用col1
和col2
完成的。任何新条目都将以0开头,因此我只需在当前行中添加该值即可。第一列计为+=1
,其他列相加
我本来可以补充一下:
printf ("Processing %s, col1 subtotal=%s, col2 subtotal=%s\n",
$1, col1[$1], col2[$1]);
当输入文件出现意外情况时,这会很有用 在END块中,我查看存储的所有名称,并使用它们显示相应的列总数。