仅使用 AWK 对特定列求和并获取另一列的唯一记录

仅使用 AWK 对特定列求和并获取另一列的唯一记录

我有一个如下的输入文件:

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 列中,我想删除重复项并打印单个值作为PL2175

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}'

相关内容