比较和提取行然后发送到新文件

时间:2014-08-01 02:13:49

标签: python bash shell functional-programming

假设有一个包含以下内容的文件:

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中编写脚本以提取所有匹配的名称并推送到新文件,而不管开头的最后一个和第一个关键字如何?

3 个答案:

答案 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_nameslast_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

请参阅Using AWK to Process Input from Multiple Files