如何有选择地grep?

时间:2013-09-24 20:11:13

标签: shell scripting sed awk grep

我的文件结构如下:

particle 1
0.1   0.988
0.2   0.975
0.2   0.945
0.3   0.900
...
...
particle 2
0.1   0.988
0.2   0.965
0.2   0.945
0.2   0.935
0.3   0.900
...

我如何grep仅在每个粒子下首次出现0.2?例如,我想grep类似

particle 1
0.2 0.975
particle 2
0.2 0.965

提前致谢!!

4 个答案:

答案 0 :(得分:6)

这个awk单行可以提供帮助:

awk '/particle/{print;p=1}p&&/^0\.2/{print;p=0}' file

添加测试:

kent$  cat f
particle 1
0.1 0.988
0.2 0.975
0.2 0.945
0.3 0.900
.....
.....
particle 2
0.1 0.988
0.2 0.965
0.2 0.945
0.2 0.935
0.3 0.900

kent$  awk '/particle/{print;p=1}p&&/^0\.2/{print;p=0}' f
particle 1
0.2 0.975
particle 2
0.2 0.965

答案 1 :(得分:0)

grep怎么样

grep -E '^partice|^.2' f

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r '/particle/b;/^0\.2/!d;:a;$!N;/^(0\.2\s).*\n\1/s/\n.*//;ta;P;D' file

如果该行包含particle则将其打印出来。如果该行未启动0.2则将其删除。删除第二行,如果它开始0.2,否则打印第一行。

答案 3 :(得分:0)

假设您只想在下面有0.2时打印粒子ID,并且样本输入中的粒子ID是占位符,但在真实文件中以非数字开头:

$ cat file
particle 1
0.1   0.988
0.2   0.975
0.2   0.945
0.3   0.900
...
particle 2
0.1   0.988
0.3   0.900
0.4   0.900
...
particle 3
0.1   0.988
0.2   0.965
0.2   0.945
0.2   0.935
0.3   0.900
...

$ awk '/^[^[:digit:]]/{p=$0} p && ($1==0.2){ print p ORS $0; p="" }' file
particle 1
0.2   0.975
particle 3
0.2   0.965