我有两个主要的 csv 文件如下:
文件1.csv
731,dev-servers.com.,A,192.168.0.10
598,test-servers.com.,A,192.168.0.12
599,test1-servers.com.,A,192.168.0.11
文件2.csv
dev-servers.com.,A,192.168.0.10
test-servers.com.,A,192.168.0.12
test1-servers.com.,A,192.168.0.11
我正在寻找命令来在 column2(file1) 和 column1(file2) 中搜索并找到适当的正确值并添加到 file2。
预期输出:
文件2.csv
731,dev-servers.com.,A,192.168.0.10
598,test-servers.com.,A,192.168.0.12
599,test1-servers.com.,A,192.168.0.11
答案1
假设 file1.csv 包含以下内容:
731,dev-servers.com.,A,wrong IP1
598,test-servers.com.,B,wrong IP2
599,test1-servers.com.,C,wrong IP3
并且 file2.csv 包含内容(示例的复制粘贴):
dev-servers.com.,A,192.168.0.10
test-servers.com.,A,192.168.0.12
test1-servers.com.,A,192.168.0.11
以下 Python 脚本将打印您所期望的内容:
numbers = {}
for lines in open("file1.csv"):
columns = lines.strip().split(",")
name = columns[1]
numbers[name] = columns[0]
for lines in open("file2.csv"):
columns = lines.strip().split(",")
name = columns[0]
try:
print("{},{},{},{}".format(numbers[name],columns[0],
columns[1],columns[2] ))
except KeyError:
print("{},{},{},{}".format('"?"',columns[0],
columns[1],columns[2] ))
(根据您的发行版更改第一行:python 或 python3)。
这里,file2.csv 的每一行都打印了一个从 file1.csv(相同的服务器名称)中获取的编号。"?"
如果找不到该编号,则会打印。
答案2
以下是纯 Bash 脚本解决方案的示例:
#!/bin/bash
while IFS=',' read -r col1 col2
do
sed -i "s/^$col2,/$col1,$col2,/" file2.csv
done < <(cut -d ',' -f 1,2 file1.csv)
cut -d ',' -f 1,2 file1.csv
file1.csv
-根据,
分隔符剪切文件的前两列while IFS=',' read -r col1 col2
- 将 2 个剪切列读入$col1
并$col2
变量sed -i "s/^$col2,/$col1,$col2,/" file2.csv
- 如果一行以找到的主机信息开头,则在其前面$col2
添加数字信息$col1
$col2
根据数据,可能需要转义。查看更多信息。