2016-12-30 152 views
0

我的文件中的数据存储在列中。这些列包含以':'分隔的特定值。如果有管道'|'我想更新值在第6或第8列。如何将给定的两行awk代码合并到一行中?

我的数据的行如下所示:

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:.:.:.:.:. 

而且,我有以下代码:

首先我更新从第六字段中的值

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个字段中有管道,我可以更新第一个字段中的值。顺便说一句,更新的价值是从第六或第八领域拉。给定的代码做我想做的,但我必须做两次。我只想要一行代码。

感谢,

+2

为您输入的问题添加预期输出。 – Inian

+2

您的预期产出是多少? – Inian

+1

你的'awk'逻辑没有做你打算做的事情。说明您的预期输出以获得更佳解决方案。 – Inian

回答

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 

未经检验。

+0

重访。 '''' –