Recodificar valores de coluna com base em valores anteriores

Recodificar valores de coluna com base em valores anteriores
1859115 2258379 24636 Yes 06S14028968 13 1 1 2
1859115 2258379 24636 Yes 06S14028968 13 1 1 2
1859116 2255037 21608 Yes 06S14028969 11 0 2 3
1859117 2268746 34027 Yes 06S14028970 10 0 2 1

Acima está o exemplo do meu conjunto de dados. Quero substituir os valores da 7ª coluna de forma que 1 seja substituído por 2 e 0 seja substituído por 1. Portanto, o resultado que espero deve ser o seguinte.

1859115 2258379 24636 Yes 06S14028968 13 2 1 2
1859115 2258379 24636 Yes 06S14028968 13 2 1 2
1859116 2255037 21608 Yes 06S14028969 11 1 2 3
1859117 2268746 34027 Yes 06S14028970 10 1 2 1

Eu tentei usar essa abordagem

awk 'NR==1{$10="Pheno";print;next}\
 $7 == "1" {$10="2"};\
 $7 == "0" {$10="1"}1'  old.txt |column -t > new.txt

e, em seguida, removendo a primeira linha. Mas eu preciso de um caminho direto.

Responder1

se o valor da coluna 7 for sempre 0 ou 1, você poderá usar:

awk 'NR>1{ $7+=1 }1' infile

caso contrário, verifique seu valor se for 0 ou 1:

awk 'NR>1 && $7 ~/^[01]$/ { $7+=1 }1' infile

parece que você adiciona o valor modificado como uma nova coluna em seu código, se precisar imprimi-lo em uma nova coluna, faça o seguinte com a mesma suposição de que o valor da coluna 7 é sempre 0 ou 1:

awk '{ print $0, (NR==1?"Pheno":++$7) }' infile

de outra forma:

awk '{ print $0, (NR==1?"Pheno":($7 ~/^[01]$/?++$7:"NA") ) }' infile

Nota: mude $7 ~/^[01]$/para ($7==1 || $7==0)para verifica estritamente se seu valor é realmente um número em vez de usar o anterior ( $7 ~/^[01]$/) que verifica apenas um único dígito inteiro 0 ou 1, o que, como resultado, não funcionará para números de pontos flutuantes, como 1.0ou 0.0ou número com zeros à esquerda como 000ou 001, etc.

informação relacionada