cree una nueva columna basada en columnas existentes usando la declaración if else en awk

cree una nueva columna basada en columnas existentes usando la declaración if else en awk

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 awkfunciona 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 awkscript 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 1al 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).

ifObviamente , 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

información relacionada