【问题标题】:awk/sed/grep to search for substring within string of second semicolon separated part/column and return only first part/column plus the substringawk/sed/grep 在第二个分号分隔的部分/列的字符串中搜索子字符串,并仅返回第一部分/列加上子字符串
【发布时间】:2021-02-15 03:13:14
【问题描述】:

我有一个包含分号分隔记录的 Unix 文件,如下所示,第二部分/列是一个带有逗号分隔值的字符串,如下所示:

789651234512;TEST-10=5,TEST-136=6,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4,TEST-9013=100
132567123784;TEST-3=1,TEST-136=5,TEST-15=4,TEST-4=2,TEST-5=3
132564013784;TEST-3=1,TEST-15=4,TEST-4=2,TEST-5=8
132496583212;TEST-13=4,TEST-136=7,TEST-23=1,TEST-6=2,TEST-5=3,TEST-4=5,TEST-6=11

我想找到所有 TEST-136=X,如果存在,其中 X 可以是从 1 到最多 3 位的任何整数,并像上面的例子一样返回它们:

789651234512;TEST-136=6
132567123784;TEST-136=5
132496583212;TEST-136=7

我正在使用下面的 awk,但它返回第二部分/列的整个字符串:

awk -F'[;]' '/TEST-136/{ print $1";"$2 }' file.txt

但是,如上所述,我只需要获取第 1 部分/列以及第 2 部分/列的 TEST-136=X 部分。

【问题讨论】:

标签: unix awk sed grep


【解决方案1】:

假设每行/记录一个匹配项。

$ awk -F';' 'match($0, /TEST-136=[[:digit:]]+/) {print $1, substr($0,RSTART,RLENGTH)}' OFS=';' kostas.txt
789651234512;TEST-136=6
132567123784;TEST-136=5
132496583212;TEST-136=7

【讨论】:

  • 这将匹配并打印出CONTEST-136=123456789 的一部分,这可能是不可取的。顺便说一句,没有必要将- 放在括号表达式中,只要它不在括号表达式中,它就已经是正则表达式中的文字。
【解决方案2】:

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

sed -En 's/^([^;]*;).*(TEST-136=[^,]*).*/\1\2/p' file

【讨论】:

    【解决方案3】:

    简单的 Perl,

    $ perl -F";" -lane ' /(TEST-136=\w+)/ and print "$F[0];$1" ' kostas.txt
    789651234512;TEST-136=6
    132567123784;TEST-136=5
    132496583212;TEST-136=7
    $
    

    【讨论】:

      【解决方案4】:

      另一个 awk

      $ awk -F"[;,]" ' { for(i=2;i<=NF;i++) if($i~/TEST-136/) print $1 ";" $i } ' kostas.txt
      789651234512;TEST-136=6
      132567123784;TEST-136=5
      132496583212;TEST-136=7
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-07
        • 2018-01-07
        • 2020-02-24
        • 1970-01-01
        • 2012-08-16
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多