我有一个问题,我有大量的文件,我需要扫描并返回一行和它的下一行,但只有当下面一行以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
注意:作为一个真正的测试,你的输入文件可能应该有一些线, Bill
和Jones
不在线的开始…
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