2

我有一个问题,我需要扫描大量文件并返回一行及其下一行,但仅当下一行以字符串开头时。

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

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

IE。原始文件:

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

我想有一种更优雅的方式可以只获取我需要的线条。任何帮助都会很可爱!

4

5 回答 5

2

作为初始方法的扩展,一个简单的解决方案是 grep 以“Bill”开头的行,然后返回一个,然后找到以“Jones”开头的行,然后返回一个......

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
于 2013-10-18T15:53:04.143 回答
1

这是一个简单的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
于 2013-10-18T15:34:38.000 回答
1

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

$ awk '$1=="Bill"{p=1;a=$0;next};$1=="Jones"&&p{print a;print};{p=0}' file
Bill Blue
Jones Red
于 2013-10-18T15:29:32.547 回答
1

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

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

它产生:

Bill Blue
Jones Red
于 2013-10-18T15:25:14.363 回答
0

这可能对您有用(GNU sed):

sed -n '$!N;/^Bill.*\nJones/p;D' file
于 2013-10-18T21:28:38.847 回答