Linux下超大CSV通话记录的行过滤方法求助
超大CSV文件行过滤解决方案
针对你已经提取出3列的filtered_CDR.CSV文件,以下是高效的行过滤方法:
推荐方案:使用awk精准匹配
awk是处理结构化文本的理想工具,能同时满足多列条件,还能保留表头:
# 保留表头 + 符合条件的数据行 awk 'NR==1 || ($2 ~ /^HG_[12]$/ && $3 == "slo.out")' filtered_CDR.CSV > final_filtered.CSV
命令细节说明
NR==1:保留第一行表头,不需要表头可直接删除这部分$2 ~ /^HG_[12]$/:严格匹配第二列(ic_hg)为HG_1或HG_2,正则避免误匹配HG_10这类变体$3 == "slo.out":精确匹配第三列(og_hg)为slo.out&&:确保两个条件同时满足- 结果重定向到
final_filtered.CSV,避免修改原文件
备选方案:使用grep(无需表头场景)
如果不需要保留表头,grep结合正则也能快速过滤:
grep -E "^[0-9]+[[:space:]]+HG_[12][[:space:]]+slo.out$" filtered_CDR.CSV > final_filtered.CSV
-E:启用扩展正则语法^[0-9]+:匹配开头的纯数字电话号码[[:space:]]+:兼容列之间任意数量的空格分隔HG_[12]:匹配目标HG值slo.out$:确保行尾精确匹配目标输出值
适配逗号分隔的情况
如果你的实际数据是逗号分隔(之前cut命令用了-d,),需要给awk指定分隔符:
awk -F, 'NR==1 || ($2 ~ /^HG_[12]$/ && $3 == "slo.out")' filtered_CDR.CSV > final_filtered.CSV
内容的提问来源于stack exchange,提问作者gareth0402
相关产品推荐
相关产品推荐

