【问题标题】:Printing the actual field delimiter value not the regular expression打印实际的字段分隔符值而不是正则表达式
【发布时间】:2013-09-21 16:32:56
【问题描述】:

给定以下输入:

check1;check2
check1;;check2
check1,check2

awk 命令:

awk -F';+|,' '{print $1 FS $2}'

FS 应该包含选定的分隔符吗?

如何打印选择的分隔符;;;,,而不是描述分隔符的正则表达式。

如果输入是check1;check2,那么输出应该是check1;check2

【问题讨论】:

    标签: regex awk delimiter gawk


    【解决方案1】:

    如果您使用的是 GNU Awk (gawk),您可以使用 split() 的第四个参数:

    gawk '{split($0, a, /;+|,/, seps); print a[1] seps[1] a[2]}' file
    

    输出:

    check1;check2
    check1;;check2
    check1,check2
    

    在循环中使用它也很容易处理:

    gawk '{nf = split($0, a, /;+|,/, seps); for (i = 1; i <= nf; ++i) printf "%s%s", a[i], seps[i]; print ""}' file
    
    22011,25029;;3331,25275
    6740,16516;;27292,1217
    13480,31488;;7947,18804
    328,30623;;12470,6883
    

    如果您只需要这些字段,您只需触摸a。分隔符将在 seps 中分隔,并且它们的索引与 a 对齐。

    【讨论】:

    • 这是一个有用且详细的答案,+1 :)
    【解决方案2】:

    我认为 awk 不会将匹配的分隔符存储在任何地方。如果你使用 GNU awk,你可以自己做:

    gawk '{match($0, /([^;,]*)(;+|,)(.*)/, a); print a[1], a[2], a[3]}'
    

    【讨论】:

    • 感谢您的出色解决方案。
    【解决方案3】:

    GNU awk 对记录而非字段具有此功能,因此您也可以执行以下操作:

    $ awk '{printf "%s%s",$0,RT}' RS=';+|,|\n' file
    check1;check2
    check1;;check2
    check1,check2
    

    其中RTRS 与给定记录匹配的值,您可以通过以下方式查看:

    $ awk '{printf "%s",RT}' RS=';+|,|\n' file
    ;
    ;;
    ,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2015-07-19
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多