2013-08-07 3 views
0

у меня есть этот вид входа:Заменить поля со значениями других полей в той же строке

rs10000004 C T 4 rs10000004 0 75625312 C C C C T 0 C T 
rs10000005 G A 4 rs10000005 0 75625355 G 0 A A A G A A 

я хочу заменить столбцы от 8 до конца от «А», если значение в столбце идентично 2-го поля $ 2 или «B», если значение идентично третьему полю $ 3. В противном случае, значение печатается как есть (нулевые значения, как ожидается, в некоторых колонках)

Ожидаемые результаты

rs10000004 C T 4 rs10000004 0 75625312 A A A A B 0 A B 
rs10000005 G A 4 rs10000005 0 75625355 A 0 B B B A B B 

Я попытался следующие, но это не дает мне никаких результатов только пустые строки. Улучшение моего кода для меня лучше, чем показать мне новое решение, используя нечто иное, чем AWK

cat input | awk '{ for(i=8; i<=NF; i++) { if($i == $2) $i="A"; else if($i == $3) $i="B"; else $i == 0; } print $i }' 

Заранее спасибо

ответ

2

Код:

awk ' 
{ 
    for (i=8; i<=NF; i++) { 
     if ($i == $2) { 
      $i = "A"; 
     } 
     else { 
      if ($i == $3) { 
       $i = "B"; 
      } 
      else { 
       $i = 0; 
      } 
     } 
    } 
    print;   
}' input 

Или короче:

awk ' 
{ 
    for (i=8; i<=NF; i++) { 
     if ($i == $2) 
      $i="A"; 
     else 
      if ($i == $3) 
       $i="B"; 
      else 
       $i = 0; 
    } 
} 
1' input 

Outp ut:

rs10000004 C T 4 rs10000004 0 75625312 A A A A B 0 A B 
rs10000005 G A 4 rs10000005 0 75625355 A 0 B B B A B B 
+1

Измените цикл, чтобы начать с 'i = 8', и удалите оператор if. –

+0

Да, сделано, спасибо. –

+0

ОК, так что это работает, но я сделал ошибку, которую вы также можете иметь, которая после последнего else {$ i = 0} не $ i == 0 не так ли? – user1421408