grep n文件中的行,n从同一文件中提取

时间:2014-01-06 15:35:00

标签: bash grep

我想: 1)从支持特定关键短语的文件中提取整数N,例如, '没有线' 2)grep N行在另一个特定短语之后,说'从这里开始',即:

输入文件

no of lines 8
.....
start from here
0.6250000000    1  O         1
0.8750000000    1  O         2
0.1250000000    1  O         3
0.3750000000    1  O         4
0.6250000000    1  O         5
0.8750000000    1  O         6
0.1250000000    1  O         7
0.3750000000    1  O         8
..... 

输出:

start from here
0.6250000000    1  O         1
0.8750000000    1  O         2
0.1250000000    1  O         3
0.3750000000    1  O         4
0.6250000000    1  O         5
0.8750000000    1  O         6
0.1250000000    1  O         7
0.3750000000    1  O         8

想到这样的事情会:

N=`grep 'no of lines' file| tr -d A-Za-z' '`
grep -A $N 'start from here'

但显然grep不允许以这种方式传递参数。

感谢您的帮助。

PS。不需要坚持grep。

更新: 我正在处理的文件实际上是一个DOS文件,我不知道。这引起了一切麻烦。所以事实上,所有提出的解决方案,包括我的(纠正的):

tr -d '\r' < file > file_n
N=`grep 'no of lines' file_n| tr -d A-Za-z' '`
grep -A $N 'start from here' file_n

工作得很好。

4 个答案:

答案 0 :(得分:1)

使用awk会更容易:

awk '/^no of lines/{N=$NF; next} /^start from here/{s=1; i=0}
         s && i<=N{print; i++; next} {s=0}' file
start from here
0.6250000000    1  O         1
0.8750000000    1  O         2
0.1250000000    1  O         3
0.3750000000    1  O         4
0.6250000000    1  O         5
0.8750000000    1  O         6
0.1250000000    1  O         7
0.3750000000    1  O         8

答案 1 :(得分:1)

当然grep允许以这种方式传递参数(因为它甚至不知道变量是传递还是纯文本)。

您的脚本存在的问题是您没有为第二个grep命令指定文件名。这是一个更好的脚本版本,可以正常工作:

n=$(grep -Pom 1 'no of lines \K[0-9]+' yourfile)
grep -A "$n" 'start from here' yourfile

答案 2 :(得分:0)

您可以使用xargs将结果从第一次调用grep重定向到第二次调用:

grep 'no of lines' file|tr -d A-Za-z' '|xargs grep 'start from here' file -A

答案 3 :(得分:0)

使用awk

awk '/^no of lines/{N=$NF} 
     /^start from here/{for(i=1;i<=N+1;i++) {print;getline}}' file