我有一个如下的输入文件:
19 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
20 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
21 | 17 | 2 | 89 | C | 9 | 100 | 9 | PL | 2175
23 | 17 | 2 | 89 | C | 9 | 100 | 9 | PL | 2175
24 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
27 | 17 | 1 | 89 | C | 9 | 100 | 9 | PL | 2175
我想对第 6 列的值单独求和,并且在第 4、5、9 和 10 列中,我想删除重复项并打印单个值作为PL
和2175
。
19 | 17 | 1 |
{删除重复和单个值}|
{删除重复和单个值}|
{此处总计}|
{此处总计}|
{此处总计}|
{删除重复项}|
{删除重复项}
我尝试了以下操作:
grep 0000000089181
输入文件| awk -F'|' '
{ sum_p_all += $5} ;
{ sum_quantity += $6} ;
{ mean_p_unit = sum_p_all/sum_quantity} ;
{ sum_p_all2 = sum_p_all * 100} ;
{ mean_p_unit2 = mean_p_unit * 100}
END { print sum_p_all2 " " sum_quantity " " mean_p_unit2 }'
答案1
我仍然不清楚您到底想要什么;但以下代码解决了您似乎想到的问题。它对所有值求和;并且只保留(打印)对于所有列 4、5、9 和 10 而言唯一的记录,在这种情况下,我们保留看到的第一个这样的记录。打印的列为 1、2、3、9、10、6、7、8。也许您可以将其调整为您想要的精确值,或者提供更多信息。p/o 未排序;如果您希望按列 1 排序,只需将输出导入 sort 即可。
#!/usr/bin/awk - f
# or your system's location
BEGIN{
FS=OFS="|";
s6=s7=s8=0;
t="";
a[""]="";
seen[""]=0;
}
{
s6 += $6;
s7 += $7;
s8 += $8;
t = $4 $5 $9 $10;
seen[t]++;
if (seen[t] == 1)
a[t] = $1 "|" $2 "|" $3 "|" $9 "|" $10 "|" $6 "|" $7 "|" $8;
}
END{
for (i in a)
print a[i];
print s6, s7, s8;
}
答案2
我刚刚尝试在 awk 中使用 uniq,它成功了。
awk -F'|' '{column4 = uniq $4}; {coumn5 = uniq $5}; {coumn6 += $6}; {column7 += $7}; {column8 += $8}; {column9 = uniq $9}; {coulmn10 = uniq $10} END {打印column4“|”column5“|”column6“|”column7“|”column8“|”column9“|”column10}'