我有一个 CSV 文件,其中有 6 列,每行都用
;
分隔(因此,从技术上讲,“SSV”- 分号分隔的值)。
根据第三个值,我想删除行以获得更小的文件。
如果第三个值是唯一的,在文件中重复两次或三次,我想删除所有这些行。只有当第三个值可以在其他行的第三列中找到四次或更多我才不想碰它。
sort -t ';' -k3,3 input.txt
我可以根据第三列对文件进行排序;但是,我只是不知道应该如何根据我的情况进行扫描和删除。
这是一个简单的两遍 Awk 解决方案。在第一次迭代中,只需收集每个值的统计信息。在第二次迭代中,根据当前值的频率打印或不打印。
awk 'BEGIN { FS=OFS=";"}
NR==FNR { ++a[3]; next }
a[3]>3' file file
file
重复两次,使 awk 读取两次。 FS=OFS=";"
在启动主脚本之前将输入和输出字段分隔符设置为分号。条件 NR==FNR
在第一轮中为真;在这里,我们只是收集数组 a
中每个值的频率并跳过脚本的其余部分。因此,在文件的第二次迭代中使用条件 a[3]>3
来决定要打印哪些行。
awk 易于学习和理解;在简单熟悉该工具后,您应该能够自己编写类似的内容。