【问题标题】:SED White Space replacement only between variables, regex usageSED 仅在变量之间替换空格,正则表达式使用
【发布时间】:2020-06-17 07:18:11
【问题描述】:

我最近在做日志分析时遇到了一个棘手的情况,我不是 REGEX 方面的专家,所以只想在这里发帖,看看我是否有什么好的解决方案

问题: 下面我粘贴了通过对 unix 日志文件执行 awk 和 grep 命令获得的结果。使用 awk |sort |uniq -c

          `2851 ABC=10087 ACG=123 RMC=17`
          `2851 ABC=10087 ACG=123 RMC=17`
          `1323 ABC=10087 ACG=123 RMC=10`
          `1323 ABC=10087 ACG=123 RMC=20`
          `1323 ABC=10087 ACG=123 RMC=20`
           `248 ABC=10087 ACG=123 RMC=8`
           `248 ABC=10087 ACG=123 RMC=8`
           `236 ABC=10087 ACG=123 RMC=7`
           `127 ABC=10087 ACG=123 RMC=16`
           `127 ABC=10087 ACG=123 RMC=16`
            `67 ABC=10087 ACG=123 RMC=1`

我将上面的输出(“|”)通过管道传递给它,并对其应用 sed 命令以对第 7 个字段(即 RMC 值按降序排列)进行排序,所以我使用了这个

sed's/=/ / g' |sort -rnk 7,7 .

在对值进行排序后,我再次将输出更改为以前的样子,所以我重新应用了我使用的 sed,

sed 's/=/ / g' |sort -rnk 7,7 |sed 's/ /=/g'

这是我所期待的

       `1323 ABC=10087 ACG=123 RMC=20`
       `1323 ABC=10087 ACG=123 RMC=20`
       `2851 ABC=10087 ACG=123 RMC=17`
       `2851 ABC=10087 ACG=123 RMC=17`
        `127 ABC=10087 ACG=123 RMC=16`
        `127 ABC=10087 ACG=123 RMC=16`
       `1323 ABC=10087 ACG=123 RMC=10`
        `248 ABC=10087 ACG=123 RMC=8`
        `248 ABC=10087 ACG=123 RMC=8`
        `236 ABC=10087 ACG=123 RMC=7`
         `67 ABC=10087 ACG=123 RMC=1`

但我的输出看起来像这样

    `===1323=ABC=10087=ACG=123=RMC=20`
    `===1323=ABC=10087=ACG=123=RMC=20`
    `===2851=ABC=10087=ACG=123=RMC=17`
    `===2851=ABC=10087=ACG=123=RMC=17`
    `====127=ABC=10087=ACG=123=RMC=16`
    `====127=ABC=10087=ACG=123=RMC=16`
    `===1323=ABC=10087=ACG=123=RMC=10`
    `====248=ABC=10087=ACG=123=RMC=8`
    `====248=ABC=10087=ACG=123=RMC=8`
    `====236=ABC=10087=ACG=123=RMC=7`
    `=====67=ABC=10087=ACG=123=RMC=1`

我怎样才能达到我想要的输出?

【问题讨论】:

  • 看起来您可以在输入时使用... | sort -rnk4.6

标签: regex linux bash sorting sed


【解决方案1】:

问题是您最后一个sed 将每个空格都更改为=。相反,尝试

sed 's/=/ / g' |sort -rnk 7,7 |sed 's/RMC /RMC=/g'

【讨论】:

    【解决方案2】:

    您只需要使用 -t 选项进行排序:

    sort -t = -rnk 4
    

    如果您告诉 sort 将等号作为字段分隔符,它会起作用。

    【讨论】:

      【解决方案3】:

      如果你能做到,为什么要sed

      echo "$response" | sort -t '=' -nr -k4
      1323 ABC=10087 ACG=123 RMC=20
      1323 ABC=10087 ACG=123 RMC=20
      2851 ABC=10087 ACG=123 RMC=17
      2851 ABC=10087 ACG=123 RMC=17
      127 ABC=10087 ACG=123 RMC=16
      127 ABC=10087 ACG=123 RMC=16
      1323 ABC=10087 ACG=123 RMC=10
      248 ABC=10087 ACG=123 RMC=8
      248 ABC=10087 ACG=123 RMC=8
      236 ABC=10087 ACG=123 RMC=7
      67 ABC=10087 ACG=123 RMC=1
      

      问候!

      【讨论】:

        【解决方案4】:

        我摆脱了反引号,因为这让我很困惑。你可以试试

        $ echo "2851 ABC=10087 ACG=123 RMC=17
        2851 ABC=10087 ACG=123 RMC=17
        1323 ABC=10087 ACG=123 RMC=10
        1323 ABC=10087 ACG=123 RMC=20
        1323 ABC=10087 ACG=123 RMC=20
        248 ABC=10087 ACG=123 RMC=8
        248 ABC=10087 ACG=123 RMC=8
        236 ABC=10087 ACG=123 RMC=7
        127 ABC=10087 ACG=123 RMC=16
        127 ABC=10087 ACG=123 RMC=16
        67 ABC=10087 ACG=123 RMC=1"| sed 's/=/ / g' |sort -rnk 7,7| sed -e 's/ /=/2' -e 's/ /=/3' -e 's/ /=/4'
        

        这给了我

        1323 ABC=10087 ACG=123 RMC=20
        1323 ABC=10087 ACG=123 RMC=20
        2851 ABC=10087 ACG=123 RMC=17
        2851 ABC=10087 ACG=123 RMC=17
        127 ABC=10087 ACG=123 RMC=16
        127 ABC=10087 ACG=123 RMC=16
        1323 ABC=10087 ACG=123 RMC=10
        248 ABC=10087 ACG=123 RMC=8
        248 ABC=10087 ACG=123 RMC=8
        236 ABC=10087 ACG=123 RMC=7
        67 ABC=10087 ACG=123 RMC=1
        

        【讨论】:

          【解决方案5】:

          这可能对你有用(GNU sed):

          sed 's/.*=\(.*\)/\1\t&/' file |
          sort -nr |
          sed 's/.*\t//'
          

          将要排序的键添加到行首,排序,删除键。

          不过,在这种情况下,Matias Barrios 和 Oliver Gaida 的回答就足够了。

          【讨论】:

            猜你喜欢
            • 2019-11-11
            • 2022-08-19
            • 1970-01-01
            • 2021-12-31
            • 2018-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多