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.0
ou 0.0
ou número com zeros à esquerda como 000
ou 001
, etc.