从文件中提取 n 的 grep n 行

  • 本文关键字:grep 提取 文件 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 不允许以这种方式传递参数。

感谢您的帮助。

无需坚持使用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

工作就好了。

使用 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

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

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

n=$(grep -Pom 1 'no of lines K[0-9]+' yourfile)
grep -A "$n" 'start from here' yourfile
您可以使用xargs

结果从第一次调用重定向到第二次调用grep

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

使用 awk

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

相关内容

  • 没有找到相关文章

最新更新