Esto es probablemente básico, pero soy completamente nuevo en la línea de comandos y uso awk. Tengo un archivo como este:
1 RQ22067-0 -9 2 RQ34365-4 1 3 RQ34616-4 1 4 RQ34720-1 0 5 RQ14799-8 0 6 RQ14754-1 0 7 RQ22101-7 0 8 RQ22073-1 0 9 RQ30201-1 0Quiero que los 0 cambien a 1 en la columna 3. Y cualquier ocurrencia de 1 y 2 para cambiar a 2 en la columna 3. Básicamente, solo cambio los números en la columna 3. Pero no estoy cambiando el -9.
1 RQ22067-0 -9 2 RQ34365-4 2 3 RQ34616-4 2 4 RQ34720-1 1 5 RQ14799-8 1 6 RQ14754-1 1 7 RQ22101-7 1 8 RQ22073-1 1 9 RQ30201-1 1He intentado usar (ver más abajo) pero no ha funcionado
>> awk '{gsub("0","1",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno >> awk '{gsub("1","2",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.phenoGracias.
Con este código en tu pregunta:
awk '{gsub("0","1",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno awk '{gsub("1","2",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.phenoestá ejecutando ambos comandos en el mismo archivo de entrada y escribiendo su salida en el mismo archivo de salida, por lo que solo la salida del segundo script estará presente en la salida, y
está tratando de cambiar 0 a 1 primero y LUEGO cambiar 1 a 2 para que los $3 que comienzan como 0 terminen como 2, debe cambiar el orden de las operaciones.
Esto es lo que debería estar haciendo, usando su código existente:
awk '{gsub("1","2",$3); gsub("0","1",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.phenoPor ejemplo:
$ awk '{gsub("1","2",$3); gsub("0","1",$3)}1' file 1 RQ22067-0 -9 2 RQ34365-4 2 3 RQ34616-4 2 4 RQ34720-1 1 5 RQ14799-8 1 6 RQ14754-1 1 7 RQ22101-7 1 8 RQ22073-1 1 9 RQ30201-1 1 El gsub() también debería ser simplemente sub() s ya que solo desea realizar cada sustitución una vez, y no necesita encerrar los números entre comillas, por lo que podría hacer:
awk '{sub(1,2,$3); sub(0,1,$3)}1' filePuede verificar el valor de la columna 3 y luego actualizar el valor del campo.
Verifique 1 como primera regla porque si la primera verificación es 0, el valor se establecerá en 1 y la siguiente verificación establecerá el valor en 2, lo que dará como resultado todos 2.
awk ' { if($3==1) $3 = 2 if($3==0) $3 = 1 } 1' fileProducción
1 RQ22067-0 -9 2 RQ34365-4 2 3 RQ34616-4 2 4 RQ34720-1 1 5 RQ14799-8 1 6 RQ14754-1 1 7 RQ22101-7 1 8 RQ22073-1 1 9 RQ30201-1 1Con las muestras mostradas y los operadores ternarios, intente seguir el código. La explicación simple sería verificar la condición si el tercer campo es 1, luego configurarlo en 2, de lo contrario, verificar si es 0, luego configurarlo en 0, de lo contrario, mantenerlo como está, finalmente imprimir la línea.
awk '{$3=$3==1?2:($3==0?1:$3)} 1' Input_file Solución genérica: agregando una solución genérica aquí, donde podemos tener 3 variables awk llamadas: fieldNumber en las que puede mencionar todos los números de campo que queremos verificar. El segundo es: existValue que queremos hacer coincidir (en condición) y el tercero es: newValue nuevo valor que debe estar allí después del reemplazo.
awk -v fieldNumber="3" -v existValue="1,0" -v newValue="2,1" ' BEGIN{ num=split(fieldNumber,arr1,",") num1=split(existValue,arr2,",") num2=split(newValue,arr3,",") for(i=1;i<=num1;i++){ value[arr2[i]]=arr3[i] } } { for(i=1;i<=num;i++){ if($arr1[i] in value){ $arr1[i]=value[$arr1[i]] } } } 1 ' Input_file