文件 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
内部变量NR
和FNR
分别是输入流中当前记录的编号和当前文件中的记录数,因此它们仅在awk
读取第一个文件时才相等。
如果我们正在读取第一个文件,我们将构建一个包含第二个字段的关联数组,该数组由第一个字段索引。
如果我们正在读取第一个文件,我们会检查其中的单个字段是否包含在关联数组中(检查是在关联数组的索引上进行的),如果我们找到匹配项,我们输出当前键和相应的值。