【问题标题】:awk mixed trailing and leading underscoreawk 混合尾随和前导下划线
【发布时间】:2013-12-03 15:02:39
【问题描述】:

要在第三个字段中保留数字低于 100(百)的行,我如何使用 awk 脚本处理尾随和前导下划线。

这里是示例输入:

asd 5.0 _84_ 34
sds 3.8 _340_ 56
sds 3.8  99  56
sds 3.8 _340_ 56          
ddd 288 _26_ 45
sdf 321 _374_ 53 
tyu 321 _39_ 89 
sds 3.8 120  56 
wer 3.8 _28_ 345
sds 3.8  45  56
tre 230 _265_ 90  
rtu 389 _372_ 45
bnm 965 _270_ 745
fgh 856 _44_ 346
sds 3.8 107  56

预期输出将是:

 asd 5.0 _84_ 34
 sds 3.8  99  56            
 ddd 288 _26_ 45
 tyu 321 _39_ 89 
 wer 3.8 _28_ 345
 sds 3.8  45  56       
 fgh 856 _44_ 346

【问题讨论】:

    标签: awk


    【解决方案1】:
    awk '$3 ~ /^_?[[:digit:]]{1,2}_?$/'
    

    这将匹配一个可选的下划线,一个或两个数字后跟一个可选的下划线。

    【讨论】:

      【解决方案2】:

      试试这个 awk 单行:

      kent$  awk -F'_| +' 'NF==4&&$3<100||NF>=6&&$4<100' file
      asd 5.0 _84_ 34
      sds 3.8  99  56
      ddd 288 _26_ 45
      tyu 321 _39_ 89
      wer 3.8 _28_ 345
      sds 3.8  45  56
      fgh 856 _44_ 346
      

      【讨论】:

      • 它工作正常,但是当尝试打印超过 100 的数字时,它会留下带有数字 120 的行,并且对于大文件,如来自 ns2 的跟踪文件,它也会打印不在范围内的数字跨度>
      • @user2677682 请用120粘贴该行
      【解决方案3】:

      使用 gawk:

       awk 'match($3, /([0-9]+)/, a) {if (a[1]<100) print $0}' input
      

      【讨论】:

      • @user2677682 - 该错误消息表示您使用的是旧的、损坏的 awk(Solaris 上的 /usr/bin/awk)。使用 /usr/xpg4/bin/awk 或 nawk 甚至更好地安装 gawk。
      【解决方案4】:
      $ awk '{line=$0; gsub(/_/,"")} $3 < 100{print line}' file
      asd 5.0 _84_ 34
      sds 3.8  99  56
      ddd 288 _26_ 45
      tyu 321 _39_ 89 
      wer 3.8 _28_ 345
      sds 3.8  45  56
      fgh 856 _44_ 346
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-04-08
        • 2013-09-05
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多