两个列表,如果找到常见匹配,则打印另一个列表元素

时间:2013-12-20 15:44:34

标签: python bash compare match

我有两个文本文件,格式。

File 1  
Column A    Column B      

File 2  
Column B    Column C  

在文件2中,B列只是文件1中数据的一个子集。

我希望搜索文件1,如果找到文件2中的B列数据点匹配,则打印A列值。

任何人都可以轻松地建议如何做到这一点吗?最好是Python或Bash。

非常感谢。

一个例子

File 1  
Bruce Dog  
Frank Cat  
Adam Fish  
Alex Horse  

File 2  
Dog Blue  
Fish Green  

会打印:

Bruce  
Adam

7 个答案:

答案 0 :(得分:4)

这可以通过使用字典

轻松实现
  1. 从第二个文件创建元素的字典。将每一行拆分为键:值对。
  2. 对于第一个文件中的每一行,将其再次拆分为Key:value并搜索字典中的值
  3. 如果找到,请打印您正在迭代的第一个文件中的值
  4. 示例实施

    from itertools import imap
    file2 = dict(imap(str.split, open("file2")))
    with open("file1") as fin:
        for key, value in imap(str.split, fin):
            if value in file2:
                print key
    

    OP注意

    如果由于未明确关闭文件句柄而导致资源泄漏,请将第一个语句括在with子句中

    with open("file2") as fin:
        file2 = dict(imap(str.split, fin))
    

答案 1 :(得分:0)

你有什么尝试?

以下是算法的一个想法:

  1. 检索文件A中的行将它们存储到变量foo
  2. 检索文件B中的行将它们存储到变量bar
  3. 使用空格将变量foo拆分为foosplited
  4. 使用空格将变量bar拆分为barsplited
  5. 执行循环:对于i中奇数foosplited索引的每个元素,如果它们相同,则查看barsplited中偶数的索引元素。如果相同,转到6;不,转到7
  6. 打印foosplited[i-1]
  7. 继续循环
  8. 暂停

答案 2 :(得分:0)

dict1 = {}

for line in file1:
    # The 2nd word will be the key, the 1st will be the value
    words = line.split()
    dict1(words[1]) = words[0]

for line in file2:
    words = line.split()
    if dict1.has_key(words[0]):
        print words[1]

答案 3 :(得分:0)

$ join -12 -21 -o 1.1 <(sort -k2,2 file1) <(sort file2)
Bruce
Adam

由于join要求在连接字段上对文件进行排序,因此无法保证输出的顺序。如果您希望输出的顺序与输入文件的顺序相同,请使用awk - 如果您搜索,请在此处提供大量示例。

答案 4 :(得分:0)

with open('file1.txt') as f1:
    d = {v:k for (k,v) in [line.split() for line in f1]}
    with open('file2.txt') as f2:
        print [d[k] for (k,v) in [line.split() for line in f2]]

>>> ['Bruce', 'Adam']

答案 5 :(得分:0)

with open("file1","rt") as f1, open("file2","rt") as f2:
    data = {}
    for line in f1:
        line = line.replace("\n","")
        colA,colB = line.split(" ")[:2]
        data[colB] = colA
    for line in f2:
        colB = line.replace("\n","").split(" ")[0]
        out = data.get(colB)
        if out:
            print out

答案 6 :(得分:0)

您可以从第一个文件创建字典,如:

dict1 = {
    "Dog": "Bruce Dog",
    "Cat": "Frank Cat"
}

因此第二列将是键,值将包含两者。然后从第二个文件的第一列创建e set

set1 = set([“Fish”,“Dog”])

然后从dict1键创建另一个集合并执行intersection

intersect = set(dict1.keys().intersection())
print intersect
>> set(["Dog"])
for i in intersect:
    print dict1[i]