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

У меня есть такой ввод:

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 на "A", если значение в столбце идентично второму полю $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 }'

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


person user1421408    schedule 07.08.2013    source источник


Ответы (1)


Код :

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

Вывод :

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 
person Gilles Quenot    schedule 07.08.2013
comment
Измените цикл так, чтобы он начинался с i=8, и удалите оператор if. - person glenn jackman; 07.08.2013
comment
хорошо, так что это работает, но я сделал ошибку, которая может быть и у вас, которая находится после последнего else {$i =0} not $i == 0, верно? - person user1421408; 07.08.2013
comment
Можно еще короче, используя тернарный оператор: awk '{for(i=8;i<=NF;i++) $i = ($i==$2) ? "A" : ($i==$3) ? "B" : 0}1' input - person glenn jackman; 07.08.2013