【问题标题】:Match a pattern in a field and replace the field with another匹配字段中的模式并将该字段替换为另一个
【发布时间】:2016-11-06 23:12:02
【问题描述】:

我有以下文件:

A T ./. 0/1 1/1
C G ./. 1/1 ./.

我想把它改成:

A  T  A A A T T T
C  G  C C G G C C

我先将文件拆分如下

awk '{ for (i=1; i<=NF; i++) { if(/\//){split($i, a, "\/"); $i=a[1]" "a[2]} }}1' file

下一步,我需要执行以下编写为伪代码的操作: a[1]a[2] 是上面代码中数组 (a) 的元素:

if a[1]==a[2]=="." then write $1 instead for both
if a[1]=="0" then write $1
if a[2]=="1" then write $2

如何在 awk 中获得这个?

【问题讨论】:

    标签: arrays awk split


    【解决方案1】:
    awk -F"[/ ]" '{for( i=3;i<=NF;i++){if ($i==0 || $i==".")$i=$1;else if($i==1) $i=$2}};1' file
    

    【讨论】:

      【解决方案2】:
      $ awk -F'[ /]+' '{a[0]=a["."]=a[$1]=$1; a[1]=a[$2]=$2; for (i=1;i<=NF;i++) printf "%s%s",a[$i],(i==NF?ORS:OFS)}' file
      A T A A A T T T
      C G C C G G C C
      

      工作原理

      • -F'[ /]+'

        这会将字段分隔符设置为一个或多个空格或/

      • a[0]=a["."]=a[$1]=$1; a[1]=a[$2]=$2

        这会根据前两个字段的值将值分配给关联数组a

      • for (i=1;i&lt;=NF;i++) printf "%s%s",a[$i],(i==NF?ORS:OFS)

        对于每个字段i,这会打印出a[$i] 的值。

        i==NF?ORS:OFS 的组合是三元语句。如果我们在最后一个字段上,即i==NF,则返回输出记录分隔符ORS。如果不是,则返回输出字段分隔符OFS

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        • 2014-08-04
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        相关资源
        最近更新 更多