如何在一个文件中获取包含字符串(带有重复)的行在另一个文件中?

时间:2015-04-23 11:27:18

标签: python linux bash file

文件1:

a
a
b
c
d

文件2:

a a1
b b1
e e1
f f1

我想要的输出:

a a1
a a1
b b1

我正在尝试使用bash或Python实现它。

在python中我尝试过:

f1=open("file1")
f2=open("file2")
dpo1=f1.readlines()
dpo2=f2.readlines()

for i in dpo2:
    for j in dpo1:
        if j in i:
            print i

在bash中我尝试过:

awk 'NR == FNR { ++h[tolower($1)]; next; } h[tolower($1)]' file1 file2

但这不考虑重复。它会给出输出

a a1
b b1

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

加入正是您所需要的:

$ join f1 f2
a a1
a a1
b b1

有关详细信息,请参阅man join

答案 1 :(得分:1)

这是使用awk的一种方法:

$ awk 'NR==FNR{a[$1]=$2;next}$0 in a{print $0,a[$0]}' file2 file1
a a1
a a1
b b1

将第二个文件中的键值对读入数组a,然后打印匹配的键值。

答案 2 :(得分:1)

您可以从第二个文件创建字典,并将第一个文件中的每个键映射到相应的值:

text = open("file2.txt").read().splitlines() 

keys = [i.split()[0] for i in text]
values = [i.split()[1] for i in text]
dic = dict(zip(keys, values))

# Now you have:
#dic = {'b': 'b1', 'e': 'e1', 'f': 'f1', 'a': 'a1'}

text = open("file1.txt").read().splitlines()

try:
    for word in text:
        print(word, dic[word])
except KeyError:
    pass

输出结果为:

a a1
a a1
b b1
>>> 

答案 3 :(得分:0)

首先阅读file2,然后阅读file1

awk '{if(FNR==NR) {# first file
          data[$1]=$2}
      else { # second file
          if($1 in data) print $1, data[$1]}' file2 file1

内部变量NRFNR分别是输入流中当前记录的编号和当前文件中记录的编号,因此它们仅在{时{ {1}}正在读取第一个文件。

如果我们正在阅读第一个文件,我们会构建一个关联数组,其中包含第二个字段,由第一个字段索引。

如果我们正在读取第一个文件,我们检查其中的单个字段是否包含在关联数组中(检查是在关联数组的 indices 上),如果我们找到匹配我们输出当前键和相应的值。