脚本 – 复制行和第二行如果第二行有一个string

我有一个问题,我有大量的文件,我需要扫描并返回一行和它的下一行,但只有当下面一行以string开始。

String one - line one must begin with 'Bill' String two - line two must begin with 'Jones'. 

如果这两个标准匹配,则返回两行。 重复整个文件。

即。 原始文件:

 Edith Blue Edith Green Edith Red Bill Blue Jones Red Edith Green Bill Green Edith Red Jones Green Bill Blue 

我希望它只返回:

 Bill Blue Jones Red 

有任何想法吗? 不知道从哪里开始,我只有基本的脚本技能与sed / awk等…目前,我用这个来获取文件名及其后续行,但它给了我太多无用的信息,我有剥离与其他sed命令。

 grep -A 1 "^Bill" * > test.txt 

我想有一个更优雅的方式来获得我所需要的线。 任何帮助将是可爱的!

作为你最初的方法的一个扩展,一个简单的解决方案是grep行以“比尔”开始返回一行,然后找到以“琼斯”开始返回之前的行….

 grep -A1 "^Bill" myfile.txt | grep "^Jones" -B1 

输出:

 Bill Blue Jones Red 

注意:作为一个真正的测试,你的输入文件可能应该有一些线, BillJones不在线的开始…

 Edith Blue Edith Jones Edith Red Bill Blue Jones Red Edith Bill Bill Jones Edith Red Jones Green Bill Blue 

对于以Bill开头的每行,使用awk的getline()指令:

 awk ' $1 ~ /^Bill/ { getline l if ( l ~ /^Jones/ ) { printf "%s\n%s\n", $0, l } } ' infile 

它产生:

 Bill Blue Jones Red 

这是另一种使用带有标志的awk的方法:

 $ awk '$1=="Bill"{p=1;a=$0;next};$1=="Jones"&&p{print a;print};{p=0}' file Bill Blue Jones Red 

这是一个简单的python脚本:

 FILE = 'test.text' f = open(FILE,'r') one = 'Bill' two = 'Jones' prev = '' for line in f: if prev.startswith(one) and line.startswith(two): print prev,line.rstrip() prev = line 

产量:

 python FileRead.py Bill Blue Jones Red 

这可能适用于你(GNU sed):

 sed -n '$!N;/^Bill.*\nJones/p;D' file