我有以下文件:
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中获得这个?
答案 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