我想: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