编写Bash脚本比对两个CSV文件并生成目标格式CSV
解决CSV文件匹配的Bash脚本问题
现有两个带表头的CSV文件data1.csv和data2.csv,内容如下:
data1.csv内容
Client Name;strnu;addr;fav MAD01;HDGF;11;V PO CVOJF01;HHD-;635;V T LINKO10;DH--JDH;98;V ZZ
data2.csv内容
USER;BINin;TYPE XXMAD01XXXHDGFXX;11;N KJDGD;635;M CVOJF01XXHHD;635;N
匹配规则
data1.csv的Client Name和strnu列内容(顺序可颠倒)随机夹杂其他字符出现在data2.csv的USER列中data1.csv的strnu值需等于data2.csv的BINin值data1.csv的fav列与data2.csv的TYPE列对应:V PO对应N、V T对应M,其他值忽略
期望输出
目标CSV需包含data2.csv的USER、data1.csv的Client Name和strnu、匹配的BINin、转换后的TYPE,结果如下:
USER;Client Name;strnu;BINin;TYPE XXMAD01XXXHDGFXX;MAD01;HDGF;11;N CVOJF01XXHHD;CVOJF01;HHD-;635;M
解决方案脚本
以下脚本可处理特殊字符匹配问题,生成符合要求的结果文件:
#!/bin/bash # 初始化结果文件,写入表头 echo "USER;Client Name;strnu;BINin;TYPE" > result.csv # 遍历data1.csv的有效数据行(跳过表头) tail -n +2 data1.csv | while IFS=';' read -r client strnu _ fav; do # 映射fav到目标TYPE,不符合规则的跳过当前行 case "$fav" in "V PO") target_type="N" ;; "V T") target_type="M" ;; *) continue ;; esac # 遍历data2.csv的有效数据行(跳过表头) tail -n +2 data2.csv | while IFS=';' read -r user binin _; do # 验证三个匹配条件:strnu与BINin相等,USER同时包含client和strnu if [[ "$binin" == "$strnu" && "$user" == *"$client"* && "$user" == *"$strnu"* ]]; then # 将匹配结果写入文件 echo "$user;$client;$strnu;$binin;$target_type" >> result.csv fi done done
脚本说明
- 用
IFS=';'指定CSV的分隔符,确保正确读取每一列内容 - 通过
case语句精准处理fav到TYPE的映射,过滤不符合规则的数据 - 使用Bash的模式匹配
== *"$client"*判断字符串包含关系,自动处理特殊字符(如减号、下划线等),无需额外转义 - 先验证
strnu与BINin的相等性,减少无效的字符串匹配判断,提升效率
内容的提问来源于stack exchange,提问作者TenEM
相关产品推荐
相关产品推荐

