Recodificar valores de columna basados ​​en valores anteriores

Recodificar valores de columna basados ​​en 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

Arriba está el ejemplo de mi conjunto de datos. Quiero reemplazar los valores de la séptima columna de manera que 1 se reemplace por 2 y 0 se reemplace por 1. Entonces, el resultado que espero debería ser el siguiente.

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

He intentado usar este enfoque.

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

y luego quitando la primera fila. Pero necesito un camino sencillo.

Respuesta1

Si el valor de la columna 7 es siempre 0 o 1, puede usar:

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

si no, verifique su valor si es 0 o 1:

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

parece que agrega el valor modificado como una nueva columna en su código, si necesita imprimirlo en una nueva columna, haga lo siguiente con la misma suposición de que el valor de la columna 7 es siempre 0 o 1 :

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

de lo contrario:

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

Nota: cambiar $7 ~/^[01]$/a ($7==1 || $7==0)verifica estrictamente que su valor sea realmente un número en lugar de usar el anterior ( $7 ~/^[01]$/) que verifica solo un dígito entero 0 o 1, lo que como resultado no funcionará para números de punto flotante como 1.0o 0.0o número con ceros a la izquierda como 000o 001, etc.

información relacionada