我文件中的数据存储在列中。这些列包含以“:”分隔的特定值。如果有管道'|'我想更新值在第6或第8列。
我的数据行如下:
0/1:38,59:97:99:.:.:2015,0,1366:0|1:.,.,.,.,.,.,.,.,.,.,.,.,.,.:1311:|:0.5 0/1:89,56:145:99:0|1:5238_G_C:2074,0,5187:.:.:.:.:. 0/1:31,65:96:99:.:.:2208,0,1170:.:.:.:.:. 0/1:58,74:132:99:.:.:2457,0,1761:.:.:.:.:.
在输入文件中,第8个字段的第一列中有一个管道。因此,第1个字段的值由第8个字段中的值更新。在第6或第8个区域将有一个管道而不是两个。其他现场位置的管道无关紧要。 对于上述输入,预期输出为:
0|1:38,59:97:99:.:.:2015,0,1366:0|1:.,.,.,.,.,.,.,.,.,.,.,.,.,.:1311:|:0.5 0/1:89,56:145:99:0|1:5238_G_C:2074,0,5187:.:.:.:.:. 0/1:31,65:96:99:.:.:2208,0,1170:.:.:.:.:. 0/1:58,74:132:99:.:.:2457,0,1761:.:.:.:.:.
而且,我有以下代码:
首先我更新第6个字段的值
awk 'BEGIN{FS=OFS="\t"} {for (i=1;i<=NF;i++) { split($i,f,/:/); if (f[6]~/\|/) sub(/^[^:]+/,f[6],$i) } }1' 2ms01e_only.pHASER01.vcf > 2ms01e_PG_6th.pHASER01.vcf
然后从第8个位置更新值
awk 'BEGIN{FS=OFS="\t"} {for (i=1;i<=NF;i++) { split($i,f,/:/); if (f[8]~/\|/) sub(/^[^:]+/,f[8],$i) } }1' 2ms01e_PG_6th.pHASER01.vcf > 2ms01e_PG_transfered.pHASER01.vcf
如何将上面的代码(两个单独的行)写成一行?因此,如果在第6或第8个字段中有管道,我可以更新第一个字段中的值。顺便说一句,更新的值是从第6或第8个字段中提取的。给定的代码执行我想要做的但我必须做两次。我只想要一行代码。
谢谢,
答案 0 :(得分:1)
<强> V2 强>
如果您只想将这2个代码组合在一起,这是一种方式:
awk 'BEGIN { FS=OFS="\t" }
{
for (i=1;i<=NF;i++) {
split($i,f,/:/);
if (f[6]~/\|/)
sub(/^[^:]+/,f[6],$i);
if (f[8]~/\|/)
sub(/^[^:]+/,f[8],$i);
}
} 1' 2ms01e_only.pHASER01.vcf > 2ms01e_PG_6th.pHASER01.vcf
未测试。