【问题标题】:Remove pattern in txt using awk or sed使用 awk 或 sed 删除 txt 中的模式
【发布时间】:2015-03-19 02:43:17
【问题描述】:

我正在尝试从某些文本中删除模式。我的意思是:

从[1426467605000,19.44] 到19.44

这是我的输入文本文件:

[1426467605000,19.44],[1426467965000,19.44],[1426468325000,19.38],[1426468685000,19.38],[1426469045000,19.38],[1426469405000,19.38],[1426469764000,19.38],[1426470124000,19.38],[1426470484000,19.38],[1426470845000,19.31],[1426471205000,19.31],[1426471565000,19.31],[1426471925000,19.31],[1426472285000,19.31],[1426472645000,19.31],[1426473005000,19.31],[1426473365000,19.31],[1426473725000,19.31],[1426474085000,19.31],[1426474445000,19.25],[1426474805000,19.25],[1426475164000,19.25],[1426475524000,19.25],[1426475884000,19.55],[1426476245000,19.25],[1426476605000,19.25],[1426476965000,19.25],[1426477325000,19.25],[1426477685000,19.19],[1426478045000,19.19],[1426478405000,19.19],[1426478764000,19.19],[1426479124000,19.19],[1426479484000,19.19],[1426479844000,19.19],[1426480204000,19.13],[1426480564000,19.13],[1426480924000,19.19],[1426481284000,19.19],[1426481644000,19.19],[1426482005000,19.19],[1426482365000,19.19],[1426482725000,19.19],

这是我想要的输出:

19.44
19.44
19.38
19.38
19.38
etc.

【问题讨论】:

    标签: awk sed


    【解决方案1】:

    这条 grep 行应该这样做:

    grep -oP '[^,]*(?=])'
    

    简而言之,这一行提取了, 和] 之间的文本,这是您想要的。

    【讨论】:

      【解决方案2】:

      为此使用grep:

      grep -oE '[0-9]+\.[0-9]+' file
      

      该模式搜索一个或多个数字,后跟一个点,然后再搜索一个或多个数字。

      -o 使 grep 仅输出匹配项,而不是匹配项出现的整行。 -E 允许我们使用 posix 扩展正则表达式,这使我们免于转义 +。


      另一种方法是像这样使用awk:

      awk -F, '{print $2}' RS='\\[|\\],|\\],\\[' file
      

      此命令执行更多语义分析,它从记录中返回第二个值。它通过[(行首)或], 或],[ 分隔记录。它打印记录的第二个字段,其中字段由, 分隔。

      如果你想允许一行的最后一条记录在没有,结尾的情况下关闭,你可以简单地将模式修改为:

      awk -F, '{print $2}' RS='\\[|\\],?|\\],\\[' file
      

      这使得记录分隔符末尾的逗号是可选的。

      【讨论】:

      • 会留下最后一个]
      • 不,两个命令的输出是相同的,并且都按预期输出数字 - 使用问题中的示例数据。
      • 抱歉,我没看到最后的逗号,我的错
      • 没问题。将, 附加到列表中的情况并不少见,这将使编写器的实现更容易一些..
      • @JID 已更改 awk 命令。现在它解决了您的顾虑。
      【解决方案3】:

      awkalternative:

      awk '$0~FS{print $1}' RS=',' FS=']' inputfile
      

      RS=',' :将 Record S分隔符更改为逗号。

      FS=']' :将 F字段 S分隔符设置为 ]。

      $0~FS : 如果FS 存在于当前记录中打印第一个字段(避免输出中的 FS)

      【讨论】:

        【解决方案4】:

        sed

        sed 's/\[[^,]\+,\([^]]\+\)\]/\1/g; s/,/\n/g'
        

        第一个正则表达式查找:文字左括号、一些非逗号字符、逗号、捕获括号、一些非右括号字符、结束捕获和文字右括号。它用捕获的文本替换所有这些。然后,剩余的逗号被换行符替换。

        【讨论】:

          【解决方案5】:

          你可以使用grep。

          $ grep -oP ',\K[^\]\[]*(?=\])' file
          19.44
          19.44
          19.38
          19.38
          19.38
          19.38
          19.38
          19.38
          

          此正则表达式将获取方括号内的最后一个字符串。

          • , 匹配第一个逗号。
          • \K 丢弃之前匹配的 char 逗号。
          • [^\]\[]* 否定字符类匹配任何字符,但不匹配 ] 或 [,零次或多次。
          • (?=\]) 肯定前瞻,它断言匹配必须后跟 ] 字符。

          【讨论】:

            【解决方案6】:

            您也可以使用 sed 和 coreutils:

            <infile tr -d '][' | tr , '\n' | sed '1d; n; d'
            

            输出:

            19.44
            19.44
            19.38
            19.38
            19.38
              .
              .
              .
            

            说明

            tr 删除括号并用换行符替换逗号。 sed 然后删除第一行和之后的每一行。

            【讨论】:

              【解决方案7】:

              使用 GNU awk 进行多字符 RS:

              $ awk -v RS='[]],[[\n]' -F, '{print $2}' file
              19.44
              19.44
              19.38
              19.38
              

              【讨论】:

                猜你喜欢
                • 2020-04-25
                • 2023-01-26
                • 1970-01-01
                • 2013-02-27
                • 1970-01-01
                • 1970-01-01
                • 2011-09-16
                • 2019-08-31
                • 1970-01-01
                相关资源
                最近更新 更多