假设有一个包含以下内容的文件:
Hello
=========
last: paul
last: susy
last: king
last: jorge
last: henry
last: ida
Goodbye
=========
first: paul
first: susy
first: charles
first: lincoln
first: ida
Example output
last: paul
first: paul
last: susy
first: susy
last: ida
first: ida
如何在bash或python中编写脚本以提取所有匹配的名称并推送到新文件,而不管开头的最后一个和第一个关键字如何?
答案 0 :(得分:0)
假设您的文件名为test.txt
,
first_names = set()
last_names = set()
for line in open('test.txt', 'r'):
if line.startswith( 'last:' ):
last_names.add( line.split()[1] )
if line.startswith( 'first:' ):
first_names.add( line.split()[1] )
output_names = []
output_names = [name for name in first_names if name in last_names]
with open('new.txt', 'w' ) as f:
for name in output_names:
f.write('last: '+name+'\n')
f.write('first: '+name+'\n')
为了解释一下,第一部分为first_names
和last_names
创建了两个空集。您可以使用这些列表,但是对于集合,检查成员资格(稍后会以if name in last_names
发生的事情)会更快。它的O(1)用于集合,O(n)用于列表,其中n是列表的大小。
Python的一个很好的功能是你可以自然地迭代文件对象的行。 line.split()[1]
部分使用空格分割线并获取第二个元素(Python索引从0开始)。
虽然这些集合对于成员资格检查来说更快,但它们是无序的,因此不会保留文件中的名称顺序。要构建output_names
我使用的是list comprehension。最后一部分将结果写入文件。
答案 1 :(得分:0)
说文件为names.txt
在Python中:
import re
import os
f = open('names.txt')
lines = f.readlines()
last_names = first_names = result = []
for line in lines:
if line.startswith('last:'):
last_names.append(line[6:])
elif line.startswith('first:'):
first_names.append(line[7:])
result = [name for name in last_names if name in first_names]
#do whatever you want to with result
答案 2 :(得分:0)
awk 'FNR==NR {a[FNR""]=$0; next}{print a[FNR""]"\n"$0}' file1 file2