在awk中使用sed
见下一行:在awk中使用sed,awk,sed,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.194
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 . . . . . . . . . . . .
1164184236 DEL00004514;DEL00004533 N。通过。GT:GL:GQ:FT:RCL:RC:RCR:CN:DR:DV:RR:RV。0/1:-11.985,0,-35.4847:120:通过:20:18:19:1:0:0:12:6。0/1:-6.1941,0,-9.19766:62:通过:4:3:2:1:0:0:3:3。0/1:-9.19536,0,-11.6939:92:通过:4:5:7:1:0:0:4:4。
我的目的是:对于所有列,如果它是
,那么我想将其更改为0/0
,那么我该怎么做呢?我正在考虑在awk中引入sed,例如:awk'{if($n=“.”)sed's/\./0\/0/g'}'
确切地说,我应该怎么做?下面是我将使用的awk命令:
awk'{for(i=1;i以下是我将使用的awk命令:
awk'{for(i=1;i带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,对于三个空格的列分隔符:
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仅用于在单个行上进行简单替换。此作业比注释中要求不更改第六个字段的要求稍微多一些,因此适合此作业的工具是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
$awk'BEGIN{FS=OFS=“\t”}{for(i=1;ised仅用于单个行上的简单替换,仅此而已。此作业比注释中要求不更改第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
$awk'BEGIN{FS=OFS=“\t”}{for(i=1;iCool.Mine是制表符分隔的…。但实际上还有另一个问题:我必须将第6列保留为“.”,所以我尝试了awk'{$6=“.”“print}“,但是制表符丢失了
和传递之间的
?更新了我的答案。酷。我的是制表符分隔的…但实际上还有另一个问题:我必须将第6列保留为”“。所以我尝试了awk'{$6=“.”“print}”,但是tab会丢失
和PASS
之间的
?更新了我的答案。sed和awk是两个不同的工具,每个工具都可以从shell调用。你永远不会从awk调用sed,反之亦然。请阅读Arnold Robbins的《有效的awk编程》,第四版。sed和awk是两个不同的工具,每个工具都可以从shell调用。你永远不会从awk调用sed,反之亦然。请阅读Arnold Robbins的《有效的awk编程》,第四版。