2016-12-30 1 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-го поля обновляется значением в восьмом поле. Там будет труба либо на 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-м поле. btw, обновленное значение вытягивается из 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

Revisited. '' '' ' –