匹配字段中的模式并将字段替换为另一个字段

时间:2016-07-05 07:47:24

标签: arrays awk split

我有以下文件:

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中获得这个?

2 个答案:

答案 0 :(得分:1)

$ 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<=NF;i++) printf "%s%s",a[$i],(i==NF?ORS:OFS)

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

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

答案 1 :(得分:1)

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