
Tengo un conjunto de datos con > 7 millones de filas (y en realidad > 20 columnas) y me gustaría crear una nueva columna (mi ejemplo de conjunto de datos tiene 5 columnas), por lo que esta sería la número 6. Mi conjunto de datos tiene un encabezado.
Las condiciones deben ser las siguientes: si los valores de la columna 1 son mayores que los de la columna 3, entonces la nueva columna debe tener el valor de la columna 1; de lo contrario debería tener el valor de "1 menos el valor de la columna 1".
Intenté esto, pero no funciona:
awk '{ if ($1 > $3) $6 == $1}; else $6 == 1-$1}' test.txt > test2.txt
Conjunto de datos (ejemplo):
col1 col2 col3 col4 col5
1 3 4 string string
4 2 1 string string
Para la línea 1, col6 debe ser 1-1 = 0
, para la línea 2, col6 debe ser 4
.
Respuesta1
==
comprueba si el valor de dos operandos es igual o no, =
asigna valores de los operandos del lado derecho al operando del lado izquierdo. Las siguientes líneas deberían funcionar:
awk '{ if($1>$3) $6=$1; else $6=1-$1; print $0; } ' test01 > test02
o:
awk '$1>$3{ $6=$1; print $0; } $1<$3{ $6=1-$1; print $0; }' test01 > test02
Porque awk
funciona de esta manera:
awk 'condition1{main1} condition2{main2} ... conditionN{mainN}' file.txt
si no se dan condiciones, siempre se ejecuta el main respectivo.
Respuesta2
Prueba esto. Sólo era necesario ==
reemplazarlo =
y agregarle los tirantes.
awk '{ if ($1 > $3){ $6=$1 }else{ $6=1-$1 } print }' test.txt >test2.txt
Respuesta3
$ awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
{ $(NF+1) = $1 }
$1 <= $3 { $NF = 1 - $NF } 1' file
col1 col2 col3 col4 col5 newcol
1 3 4 string string 0
4 2 1 string string 4
Cuando el awk
script ha agregado y generado el nuevo encabezado de columna, comienza a calcular el valor de la nueva columna para las otras filas.
El valor se calcula configurándolo primero en el valor de la columna 1, y si la columna 1 es menor o igual que la columna 3, se resta de 1. El solitario 1
al final hace que se imprima el registro (línea) modificado.
Asignar un valor a $(NF + 1)
("el campo después del último campo") agregará una columna adicional a la línea actual y también incrementará NF
(el número de campos en el registro actual).
if
Obviamente , también puedes hacer esto con una declaración explícita :
awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
{ if ($1 > $3) $(NF+1) = $1; else $(NF+1) = 1 - $1 } 1' file