读取csv file2的column1并与file1的column2匹配,如果文本匹配则将file1中的column1值添加到file2

读取csv file2的column1并与file1的column2匹配,如果文本匹配则将file1中的column1值添加到file2

文件1.csv

9,hello-world.com.,A,192.168.0.9
1,hello1-world.com.,A,192.168.0.1
2,hello2-world.com.,A,192.168.0.2
3,hello3-world.com.,A,192.168.0.3
4,hello4-world.com.,A,192.168.0.4
5,hello5-world.com.,A,192.168.0.5
6,hello6-world.com.,A,192.168.0.6
7,hello7-world.com.,A,192.168.0.7
8,hello8-world.com.,A,192.168.0.8

文件2.csv

hello4-world.com.,A,192.168.0.4
hello2-world.com.,A,192.168.0.2
hello7-world.com.,A,192.168.0.7

我有两个csv文件,file1有很多数据,file2有较少的数据,我需要在column2 file1中找到file2的column1,只有匹配文本应该有从file1到file2的第一列值需要添加。

输出应该有单独的文件或 file2 使用新值进行更新。

预期输出:

4,hello4-world.com.,A,192.168.0.4
2,hello2-world.com.,A,192.168.0.2
7,hello7-world.com.,A,192.168.0.7

尝试过Python代码:

#! /usr/bin/python

t = {}
address = {}

for lines in open("file2.csv"):
    columns = lines.strip().split(",")
    name = columns[0]
    t[name] = columns[1]
    address[name] = columns[2]
    
for lines in open("file1.csv"):
    columns = lines.strip().split(",")
    name = columns[1]
    try:
        print("{},{},{},{}".format(columns[0], name, t[name], address[name]))
    except KeyError:
        print("{},{},{},{}".format(columns[0], name, columns[2], columns[3]))

上面的代码尝试过,但它复制了 file1 的所有内容作为输出,但我只需要 file2 的匹配内容。

先感谢您。

答案1

如果您的数据真的那么简单(字段内没有逗号,字段内没有换行符,除了您显示的非常简单的示例之外什么都没有),那么您真的不需要 python 脚本。你可以做一个简单的 awk 单行代码:

$ awk -F, 'NR==FNR{a[$1]; next} $2 in a' file2.csv file1.csv 
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7

这只是简单地读取第一个文件(NR==FNR意味着“整个输入行号与当前文件的行号相同”,因此意味着“读取第一个文件时”),将其第一个字段保存在数组中aa[$1]) ,然后在第二个文件中,它将打印第二个字段可以在a数组中找到的所有行。

你甚至可以这样做:

$ grep -Ff <(cut -d, -f1 file2.csv) file1.csv 
2,hello2-world.com.,A,192.168.0.2
4,hello4-world.com.,A,192.168.0.4
7,hello7-world.com.,A,192.168.0.7

但是,这将匹配 file2 第一个字段的值,无论它们在 file1 中的哪个字段中找到。


重要警告:csv 文件可能非常复杂,因此仅当您完全控制数据并且可以保证始终满足第一句中的条件(没有内部逗号,没有多行字段)时才使用此功能。

相关内容