You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:41:29