【问题标题】:Ordering Grep Output With Multiple Patterns使用多种模式订购 Grep 输出
【发布时间】:2020-02-15 12:01:59
【问题描述】:

我正在搜索的文件(fruit.text)类似于下面的 sn-p,数据以我无法控制的随机顺序出现。

....fruit=apple,...qty=3,...condition=bad,....

...数量=4,...条件=很棒,...水果=橙子,...

...条件=ok,...数量=2,...水果=香蕉,...

我的 Grep 命令是:grep -Eo 'fruit.[^,]*'\|'qty.[^,]*'\|'condition.[^,]*' fruit.txt

这会产生如下输出:

水果=苹果

数量=3

条件=坏

数量=4

条件=很棒

水果=橙

条件=正常

数量=2

水果=香蕉

这是正确的,但是,我正在寻找要按照我在 grep cmd 中指定的顺序的输出。即,完全像下面这样:

水果=苹果

数量=3

条件=坏

水果=橙

数量=4

条件=很棒

水果=香蕉

数量=2

条件=正常

【问题讨论】:

    标签: regex macos unix command-line grep


    【解决方案1】:

    gawk 的解决方案:

    首先我在输入中添加了一些额外的“,”:

    ....,fruit=apple,...,qty=3,...,condition=bad,....
    ...,qty=4,...,condition=great,...,fruit=orange,...
    ...,condition=ok,...,qty=2,...,fruit=banana,...
    

    然后我写了这个 awk 脚本(fruit.awk):

    { fruit ="";
      qty="";
      condition="";
      for (i = 1;i <= NF; i++){
            delete a;
            split($i,a,"=");
            if (a[1]=="fruit" ) { fruit=a[2]; }
            if (a[1]=="qty") { qty=a[2] }
            if (a[1]=="condition") { condition=a[2] }
       }
    }
    { print "fruit=" fruit;
      print "qty=" qty;
      print "condition=" condition;
    }
    

    输出:gawk -F , -f fruit.awk fruit.txt:

    fruit=apple
    qty=3
    condition=bad
    fruit=orange
    qty=4
    condition=great
    fruit=banana
    qty=2
    condition=ok
    

    【讨论】:

      【解决方案2】:

      在某些步骤中使用sed

      sed -E 's/^/,/;
              s/(.*),(condition[^,]*)/\2\r,\1/;
              s/(.*),(qty=[^,]*)/\2,\1/;
              s/(.*),(fruit=[^,]*)/\2,\1/;
              s/\r.*//;
              s/,/\n/g' input.txt
      

      我首先插入一个, 用于输入,有趣的数据从第一个字段开始。
      condition后面我加了一个\r,这样我找到水果后就可以把垃圾清理掉了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2017-03-15
        • 2023-02-22
        • 1970-01-01
        • 2013-06-18
        • 2014-06-09
        相关资源
        最近更新 更多