如何匹配CSV1.host与CSV2.oldhost并替换为CSV2.newhost生成新CSV?
解决CSV主机名替换问题的两种实用方法
Hey Mitch, great question—this is a classic CSV data matching/replacement task, and I’ve got two straightforward solutions for you depending on your workflow preference.
方法1:用Python Pandas(推荐,易维护)
Pandas makes this kind of CSV manipulation a breeze, especially with your hundreds of rows of data. Here's a step-by-step script that does exactly what you need:
import pandas as pd # 读取输入的两个CSV文件 # 如果你的CSV没有表头,可添加header=None并手动指定列名 csv1 = pd.read_csv("CSV1.csv") csv2 = pd.read_csv("CSV2.csv") # 把CSV2转换成快速查找的字典:key为oldhost,value为newhost host_mapping = csv2.set_index("oldhost")["newhost"].to_dict() # 替换CSV1的host列:匹配到的替换为newhost,未匹配的保留原值 csv1["host"] = csv1["host"].map(host_mapping).fillna(csv1["host"]) # 输出到新文件CSV3,不保留pandas自动生成的索引 csv1.to_csv("CSV3.csv", index=False)
关键细节说明:
map(host_mapping):自动遍历CSV1的host列,查找是否存在映射关系,匹配成功则替换为对应的newhostfillna(csv1["host"]):确保未匹配到的host值不会变成空值(NaN),而是保留原始内容- 如果你的CSV使用非逗号分隔符(如制表符),可在
read_csv中添加sep="\t"参数调整
方法2:用Awk(命令行快速解决)
If you prefer staying in the command line and don’t want to write a Python script, awk is a perfect lightweight option. Here's how to set it up:
首先创建一个名为replace_hosts.awk的脚本文件:
BEGIN { FS = "," # 设置输入分隔符为逗号 OFS = "," # 设置输出分隔符为逗号 } # 先处理CSV2,将oldhost和newhost存入关联数组 NR == FNR { mapping[$1] = $2 # 假设CSV2第1列是oldhost,第2列是newhost next } # 处理CSV1,替换host列(假设CSV1第3列是host,需根据实际调整列号) { if ($3 in mapping) { $3 = mapping[$3] } print # 输出修改后的行 }
然后在终端运行命令:
awk -f replace_hosts.awk CSV2.csv CSV1.csv > CSV3.csv
注意事项:
- 务必根据你的CSV实际列位置调整
$1、$2、$3:比如如果CSV1的host是第2列,就把$3改成$2 - 若需要忽略大小写匹配(如"DC001"和"dc001"视为同一值),可在脚本中添加字符串大小写转换逻辑
不管用哪种方法,建议先拿一小部分测试数据验证逻辑,确认替换正确后再处理完整的几百行数据哦。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

