【问题标题】:awk to remove text and split on two delimitersawk 删除文本并在两个分隔符上拆分
【发布时间】:2019-09-24 23:00:25
【问题描述】:

我正在尝试使用awk 删除最后一位数字之后的文本并由: 分割。这对这两行来说都很常见,我相信下面awk 的第一部分会做到这一点。如果行中没有_,则$2$3 中重复,我相信拆分会做到这一点。我不知道该怎么做是如果是_ 在行中然后_ 左边的数字是$2_ 右边的数字是$3。谢谢你:)。

输入

chr7:140453136A>T 
chr7:140453135_140453136delCAinsTT

想要的

chr7    140453136   140453136 
chr7    140453135   140453136

awk

awk '{sub(/[^0-9]+$/, "", $1); {split($0,a,":"); print a[1],a[2]a[2]} 1' input

【问题讨论】:

    标签: awk


    【解决方案1】:

    这是一个:

    $ awk '
    BEGIN { 
        FS="[:_]"               # using field separation for the job
        OFS="\t"
    }
    {
        sub(/[^0-9]*$/,"",$NF)  # strip non-digits off the end of last field
        if(NF==2)               # if only 2 fields
            $3=$2               # make the $2 from $2
    }1' file                    # output
    

    输出:

    chr7    140453136       140453136
    chr7    140453135       140453136
    

    在 GNU awk、mawk、Busybox awk 和 awk 版本 20121220 上测试。

    【讨论】:

    • 没问题,再等一会,你可能会得到一个很酷的答案。
    • 如果使用 sub,你可以直接使用 $NF+=0。字符串到数字的转换规则将启动。当前版本将在字符串 1234gh5hsue 上失败
    【解决方案2】:

    使用 GNU awk:

    awk -v FPAT='[0-9]+|chr[0-9]*' -v OFS='\t' 'NF==2{$3=$2}{$1=$1}1'
    

    这依赖于字段模式FPAT,它是一个表示数字的正则表达式或带有数字的字符串chr

    语句NF==2{$3=$2}如果记录中只有2个,则复制第二个字段。

    最后一条语句是强制 awk 重建记录以获得所需的格式。

    【讨论】:

      【解决方案3】:
      $ awk -F'[:_]' '{print $1, $2+0, $NF+0}' file
      chr7 140453136 140453136
      chr7 140453135 140453136
      

      【讨论】:

        【解决方案4】:

        您能否尝试以下更通用的解决方案,即没有硬编码将字段值复制到另一个字段等,您可以简单地在awk 变量中提及字段值的最大数量,它会检查每一行(以及从它们的值中删除字母)并将最后一个值复制到该行的最大值的末尾。

        awk -F'[:_]' -v max="3" '
        {
          for(i=2;i<=max;i++){
            if($i==""){
              $i=$(i-1)
            }
            gsub(/[^0-9]+/,"",$i)
          }
        }
        1
        '   Input_file
        

        要以制表符分隔的形式输出,请在上面的代码中附加| column -t

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-19
          • 1970-01-01
          • 2013-06-07
          • 2016-08-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-06
          相关资源
          最近更新 更多