awk - 使用 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
程序。简单的解释是,按照第一、第二和第三个字段对 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
}
}
'
推荐阅读
- android - 如何在 ScrollView 中将 LinearLayout 高度设置为匹配父级
- java - 设置一个 java servlet 和一个 Ajax 请求来获取一个 JPG 图像到前端
- memory-leaks - store.add 中 indexedDB 中的内存泄漏示例(请参阅编辑中的示例)
- php - 生成 getter 和 setter 学说时出错
- python - Tkinter 布局问题
- git - 如何将 svn repo 的标签和分支从本地上传到 bitbucket
- github - 在一个项目下使用多个 Github 存储库
- ms-word - 禁用 word VSTO 中的 undo 功能
- ansible - 尽管使用了“异步”,但延迟在多个主机上调用 ansible 任务
- c - 在while循环中计数3秒