【问题标题】:How to selectively grep?如何选择性地grep?
【发布时间】:2013-09-30 05:33:42
【问题描述】:

我有一个结构如下的文件:

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

提前致谢!!

【问题讨论】:

  • @RahulTripathi -m 1 只会让 grep 匹配一次。我认为你的 grep 行不会满足 OP 的要求。
  • @Kent:- 明白了!!!也谢谢你纠正我!!!

标签: shell scripting sed awk grep


【解决方案1】:

假设您只想在粒子 id 下面有 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

【讨论】:

    【解决方案2】:

    这可能对你有用(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】:

      grep 怎么样

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

      【讨论】:

        【解决方案4】:

        这个 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
        

        【讨论】:

          猜你喜欢
          • 2022-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-06
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 2020-05-30
          相关资源
          最近更新 更多