首页 > 解决方案 > 使用 awk 删除和总结 csv 文件元素

问题描述

我有一个像这个例子这样的大 csv 文件:

9,AGCTGTCCTCTT,SCPL
9,AGCTGTCATTTTGTTTCG,SCHFVS
9,AGCTGTAATTGTCGTAAGAGGTCTGCTTATTGTTATTTGTGTGGCCCG,SCNCRKRSAYCYLCGP
9,AGCTGTCCTCTT,SCPL
9,AGCTGTAGTCATTTGGGTTTTATTTGTTTTCATGGCATTGTGGCCCG,

1 - 在某些行中,第 3 列为空,因此应将其删除

2 - 有些行在第 3 列中有相似的字符。如果是这种情况,我想总结第一列中的值并将其放在第四列中。如果第 3 列中的字符在其他行中没有重复,我想将第 1 列的值复制到第 4 列。

预期输出:

9,AGCTGTCCTCTT,SCPL,18
9,AGCTGTCATTTTGTTTCG,SCHFVS,9
9,AGCTGTAATTGTCGTAAGAGGTCTGCTTATTGTTATTTGTGTGGCCCG,SCNCRKRSAYCYLCGP,9

为此,我在 awk 中编写了以下代码,但它没有返回预期的输出。

awk -F "," '{ if(($3 == '') && ({t=3;for(i=2;i<NF;i++){t+=$i==$(i+1)}}t==NF)) { print } }' infile.csv > outfile.csv

您知道如何更改代码以获得预期的输出吗?

标签: awk

解决方案


使用您显示的示例,请尝试以下awk程序。简单的解释是,按照第一、第二和第三个字段对 Input_file 进行排序,,首先作为字段分隔符。然后将其标准输出awk作为输入传递给程序。在awk程序中设置字段分隔符和输出字段分隔符为,. 创建变量 sum 不断向其添加第一个字段值,直到当前行与上一行不同。

sort -t, -r -k1 -k2 -k3 file | 
awk '
BEGIN{
  FS=OFS=","
}
prev!=$0 && prev{
  print prev,sum
  sum=prev=""
}
NF>=3 && $3!=""{
  sum+=$1
  prev=$0
}
END{
  if(sum){
   print prev,sum
  }
}
'

推荐阅读