如何将给定的两行awk代码合并为一行?

时间:2016-12-30 03:41:29

标签: linux ubuntu awk replace sed

我文件中的数据存储在列中。这些列包含以“:”分隔的特定值。如果有管道'|'我想更新值在第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个字段中提取的。给定的代码执行我想要做的但我必须做两次。我只想要一行代码。

谢谢,

1 个答案:

答案 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

未测试。