Bash脚本中对比|分隔CSV文件,生成匹配与非匹配结果文件
问题:按指定列匹配
|分隔的CSV文件并拆分结果 我有两个以|为分隔符的CSV文件,需要在Bash脚本中处理:
- File A包含5列(示例中显示为4列,可按需调整列索引),无表头
- File B包含1列,无表头
需求:
- 生成File C:保存File A中目标列与File B第1列匹配的完整行
- 生成File D:保存File A中不匹配的完整行
示例文件
File A内容
CT240021313|2024-02-04 00:00:02|CT|1.2.345.6 AB123|2024-02-01 11:22:33|MR|7.8.98.102 PDQ987|2024-02-04 8:50:11|XR|1.23.45.6 PA7531|2024-02-03 9:34:52|CT|6.3.489
File B内容
1.2.345.6 6.3.489
期望输出
File C(匹配行)
CT240021313|2024-02-04 00:00:02|CT|1.2.345.6 PA7531|2024-02-03 9:34:52|CT|6.3.489
File D(不匹配行)
AB123|2024-02-01 11:22:33|MR|7.8.98.102 PDQ987|2024-02-04 8:50:11|XR|1.23.45.6
当前错误命令
awk 'NR==FNR{a[$0];next !($0 in a)' file_a.csv file_b.csv > file_c.csv
解决方案
你的命令存在三个问题:未指定分隔符、处理文件顺序错误、语法缺失闭合括号。以下是修正后的命令,可一次性生成两个目标文件:
awk -F'|' 'NR==FNR{a[$0]; next} {if ($4 in a) print > "file_c.csv"; else print > "file_d.csv"}' file_b.csv file_a.csv
命令说明
-F'|':指定字段分隔符为|,确保正确拆分CSV列NR==FNR{a[$0]; next}:先处理File B,将所有匹配项存入数组a,然后跳过后续逻辑- 处理File A时:判断第4列(若实际为5列,替换为
$5)是否在数组a中,匹配写入file_c.csv,不匹配写入file_d.csv
内容的提问来源于stack exchange,提问作者bgorton
相关产品推荐
相关产品推荐

