【问题标题】:AWK use gsub under conditionAWK 在条件下使用 gsub
【发布时间】:2019-11-12 09:05:56
【问题描述】:

如果条件匹配,我对部分字符串的 gsub 有疑问......

输入(制表符分隔)

a  b  a////l&&o c
a  c  d////p&&v c
c  o  a////p&&v z

输出

a  b  alo c
a  c  dpv c
c  o  a////p&&v z

我正在尝试使用:

awk -F'\t' -v OFS="\t" '{if($1=="a"){gsub(////,"",$3);gsub(&&,"", 3美元) 打印$0;否则打印 $0}}' 输入

但它不起作用。

谢谢

【问题讨论】:

    标签: awk conditional-statements gsub


    【解决方案1】:

    awk 的另一种方式:

    awk -F'[/&]' -v OFS="" '/^a/{$1=$1}7' file
    

    这个想法是,我们使用/ or &作为FS,如果一行以a开头,我们使用$1=$1,这样输出中的FS将被OFS替换。否则我们只打印带有原始 FS 字符的行。

    【讨论】:

      【解决方案2】:

      请您尝试关注一下。

      awk '$1=="a"{gsub(/\/+|&+/,"",$3)} 1'  Input_file
      

      awk '{if($1=="a"){gsub(/\/+|&+/,"",$3)}} 1' Input_file
      

      或根据 OP 的要求添加如下:"

      awk '{if($1=="a"){gsub(/\/+|&+/,"",$3);print $0} else {print $0}} 1' Input_file
      

      如果您的 Input_file 是 TAB 分隔的,请尝试以下操作。

      awk 'BEGIN{FS=OFS="\t"} $1=="a"{gsub(/\/+|&+/,"",$3)} 1' Input_file
      

      awk 'BEGIN{FS=OFS="\t"}{if($1=="a"){gsub(/\/+|&+/,"",$3)}} 1' Input_file
      

      或根据 OP 的要求:

      awk 'BEGIN{FS=OFS="\t"}{if($1=="a"){gsub(/\/+|&+/,"",$3);print $0} else {print $0}} 1' Input_file
      

      【讨论】:

      • 还有if else if else语句可以写吗?
      • @Vonton,像这样吗? awk '{if($1=="a"){gsub(/\/+|&+/,"",$3)}} 1' Input_fileawk 'BEGIN{FS=OFS="\t"}{if($1=="a"){gsub(/\/+|&+/,"",$3)}} 1' Input_file
      • 我提到了类似 awk -F'\t' -v OFS="\t" '{if($1=="a"){gsub(/\/+|&+/, "",$3) 打印 $0; else print $0}' 但它不适用于这种语法
      • @Vonton,请检查我的第二个还是现在?
      • 伟大的工作,它的工作。我使用了错误的 {} 和 ; .非常感谢
      【解决方案3】:

      你可以使用

      awk 'BEGIN{FS=OFS="\t"} $1=="a"{gsub(/[\/&]/,"",$3)}1' file > outfile 
      

      查看online demo

      s="a    b   a////l&&o   c
      a   c   d////p&&v   c
      c   o   a////p&&v   z"
      awk 'BEGIN{FS=OFS="\t"} $1=="a"{gsub(/[\/&]/,"",$3)}1' <<< "$s"
      

      输出:

      a   b   alo c
      a   c   dpv c
      c   o   a////p&&v   z
      

      详情

      • BEGIN{FS=OFS="\t"} - 将输入/输出字段分隔符设置为制表符
      • $1=="a" - 如果字段 1 的值为 a
      • {gsub(/[\/&amp;]/,"",$3)} - 将每个 /&amp; 替换为字段 3 中的空字符串
      • 1 - 默认打印操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 2019-04-21
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 2013-02-03
        • 1970-01-01
        相关资源
        最近更新 更多