在awk中使用sed

时间:2016-04-16 04:59:12

标签: awk sed

见下面一行:

1   164184236   DEL00004514;DEL00004533 N   <DEL>   .   PASS    .   GT:GL:GQ:FT:RCL:RC:RCR:CN:DR:DV:RR:RV   .   .   .   .   0/1:-11.985,0,-35.4847:120:PASS:20:18:19:1:0:0:12:6 .   .   .   .   .   .   .   .   .   .   .   .   .   0/1:-6.1941,0,-9.19766:62:PASS:4:3:2:1:0:0:3:3  .   .   .   .   .   .   .   .   .   .   .   .   .   .   0/1:-9.19536,0,-11.6939:92:PASS:4:5:7:1:0:0:4:4 .   .   .   .   .   .   .   .   .   .   .   .

我的目的是:对于所有专栏,如果它是.,那么我想改为0/0,那我该怎么做呢?我正在考虑在awk中引入sed,例如:awk ‘{if($n= ".") sed 's/\./0\/0/g'}' 究竟应该怎么做

3 个答案:

答案 0 :(得分:2)

sed用于单个行上的简单替换,即全部。考虑到你的评论中没有要求改变第6个字段,所以这个工作要多一点,所以工作的正确工具是awk:

$ awk 'BEGIN{FS=OFS="\t"} {for (i=1;i<=NF;i++) if (($i==".") && (i!=6)) $i="0/0"} 1' file
1       164184236       DEL00004514;DEL00004533 N       <DEL>   .       PASS    0/0     GT:GL:GQ:FT:RCL:RC:RCR:CN:DR:DV:RR:RV   0/0   0/0      0/0     0/0     0/1:-11.985,0,-35.4847:120:PASS:20:18:19:1:0:0:12:6     0/0     0/0     0/0     0/0     0/0     0/0     0/0   0/0      0/0     0/0     0/0     0/0     0/0     0/1:-6.1941,0,-9.19766:62:PASS:4:3:2:1:0:0:3:3  0/0     0/0     0/0     0/0     0/0   0/0      0/0     0/0     0/0     0/0     0/0     0/0     0/0     0/0     0/1:-9.19536,0,-11.6939:92:PASS:4:5:7:1:0:0:4:4 0/0     0/0   0/0      0/0     0/0     0/0     0/0     0/0     0/0     0/0     0/0     0/0

答案 1 :(得分:1)

这是我要使用的awk命令:
awk '{for(i = 1; i <= NF; i++) {if ($(i) == ".") {$(i)="0/0"}} print $0}'

测试:

echo "1   164184236   DEL00004514;DEL00004533 N   <DEL>   .   PASS    .   GT:GL:GQ:FT:RCL:RC:RCR:CN:DR:DV:RR:RV   .   .   .   .   0/1:-11.985,0,-35.4847:120:PASS:20:18:19:1:0:0:12:6 .   .   .   .   .   .   .   .   .   .   .   .   .   0/1:-6.1941,0,-9.19766:62:PASS:4:3:2:1:0:0:3:3  .   .   .   .   .   .   .   .   .   .   .   .   .   .   0/1:-9.19536,0,-11.6939:92:PASS:4:5:7:1:0:0:4:4 .   .   .   .   .   .   .   .   .   .   .   ." | awk '{for(i = 1; i <= NF; i++) {if ($(i) == ".") {$(i)="0/0"}} print $0}'

给予:

1 164184236 DEL00004514;DEL00004533 N <DEL> 0/0 PASS 0/0 GT:GL:GQ:FT:RCL:RC:RCR:CN:DR:DV:RR:RV 0/0 0/0 0/0 0/0 0/1:-11.985,0,-35.4847:120:PASS:20:18:19:1:0:0:12:6 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1:-6.1941,0,-9.19766:62:PASS:4:3:2:1:0:0:3:3 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1:-9.19536,0,-11.6939:92:PASS:4:5:7:1:0:0:4:4 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0

答案 2 :(得分:1)

使用sed,对于三个空格的列分隔符:

sed 's/\( \{3\}\)\./\10\/0/g' file

如果制表符分隔:

sed 's/\t\./\t0\/0/g' file

输出:

1   164184236   DEL00004514;DEL00004533 N   <DEL>   0/0   PASS    0/0   GT:GL:GQ:FT:RCL:RC:RCR:CN:DR:DV:RR:RV   0/0   0/0   0/0   0/0   0/1:-11.985,0,-35.4847:120:PASS:20:18:19:1:0:0:12:6 .   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/1:-6.1941,0,-9.19766:62:PASS:4:3:2:1:0:0:3:3  .   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/1:-9.19536,0,-11.6939:92:PASS:4:5:7:1:0:0:4:4 .   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0   0/0

更新:

    sed 's/\t\./\t0\/0/2g' file

从找到的第二个.开始替换,假设前五列没有点值。