如何基于SSV文件第三列排序并按重复次数筛选删除行?
处理分号分隔文件(SSV)的行过滤问题
可以通过两种高效的命令行方案实现需求,以下是具体操作:
方案一:用awk一次性完成(推荐,适合大文件)
直接使用awk统计第三列的出现次数并过滤行,无需生成中间文件:
awk -F';' 'NR==FNR {count[$3]++; next} count[$3]>=4' input.txt input.txt
命令解释:
-F';':指定字段分隔符为分号NR==FNR:仅在处理第一个input.txt时执行统计逻辑,用count[$3]++记录第三列每个值的出现次数,next跳过后续判断- 处理第二个
input.txt时,判断当前行第三列的值的出现次数是否≥4,满足条件则打印该行
方案二:结合sort、uniq、grep分步操作(逻辑清晰)
分两步筛选出需要保留的行:
- 提取第三列并筛选出现4次及以上的值,保存到临时文件:
cut -d';' -f3 input.txt | sort | uniq -c | awk '$1>=4 {print $2}' > keep_values.txt
- 过滤原文件,仅保留第三列值在临时文件中的行:
grep -Ff keep_values.txt input.txt
步骤解释:
cut -d';' -f3:提取文件的第三列内容sort | uniq -c:对第三列值排序后统计每个值的出现次数awk '$1>=4 {print $2}':筛选出出现次数≥4的值,写入keep_values.txtgrep -Ff keep_values.txt:按固定字符串匹配,从原文件中过滤出第三列值在keep_values.txt中的行
内容的提问来源于stack exchange,提问作者raccoon102
相关产品推荐
相关产品推荐

