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



文件 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

有什么想法吗?

join正是您所需要的:

$ join f1 f2
a a1
a a1
b b1

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

以下是使用 awk 的一种方法:

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

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

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

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
>>> 

先读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分别是输入流中当前记录的编号和当前文件中的记录数,因此它们仅在awk读取第一个文件时才相等。

如果我们正在读取第一个文件,我们将构建一个包含第二个字段的关联数组,该数组由第一个字段索引。

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

相关内容

  • 没有找到相关文章

最新更新