crie uma nova coluna com base nas colunas existentes usando a instrução if else no awk

crie uma nova coluna com base nas colunas existentes usando a instrução if else no awk

Eu tenho um conjunto de dados com> 7 milhões de linhas (e na realidade> 20 colunas) e gostaria de criar uma nova coluna (meu exemplo de conjunto de dados tem 5 colunas), então este seria o número 6. Meu conjunto de dados tem um cabeçalho.

As condições devem ser as seguintes: Se os valores da coluna 1 forem maiores que os da coluna 3, então a nova coluna deverá ter o valor da coluna 1; caso contrário, deverá ter o valor "1 menos o valor da coluna 1".

Eu tentei isso, mas não funciona:

awk '{ if ($1 > $3) $6 == $1}; else $6 == 1-$1}' test.txt > test2.txt

Conjunto de dados (exemplo):

col1 col2 col3 col4 col5
1 3 4 string string
4 2 1 string string

Para a linha 1 col6 deve ser 1-1 = 0, para a linha 2 col6 deve ser 4.

Responder1

==verifica se os valores de dois operandos são iguais ou não, =atribui valores dos operandos do lado direito ao operando do lado esquerdo. As seguintes linhas devem funcionar:

awk '{ if($1>$3) $6=$1; else $6=1-$1; print $0; } ' test01 > test02 

ou:

awk '$1>$3{ $6=$1; print $0; } $1<$3{ $6=1-$1; print $0; }' test01 > test02 

Porque awkfunciona desta forma:

awk 'condition1{main1} condition2{main2} ... conditionN{mainN}' file.txt

se nenhuma condição for fornecida, o respectivo main será sempre executado.

Responder2

Experimente isso. Só precisava ==substituir =e adicionar o aparelho.

awk '{ if ($1 > $3){ $6=$1 }else{ $6=1-$1 } print }' test.txt >test2.txt

Responder3

$ 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

Quando o awkscript adiciona e gera o novo cabeçalho da coluna, ele começa a calcular o valor da nova coluna para as outras linhas.

O valor é calculado primeiro definindo-o como o valor da coluna 1 e, se a coluna 1 for menor ou igual à coluna 3, ele será subtraído de 1. O solitário 1no final faz com que o registro modificado (linha) seja impresso.

Atribuir um valor a $(NF + 1)("o campo após o último campo") adicionará uma coluna extra à linha atual e também aumentará NF(o número de campos no registro atual).

ifObviamente, você também pode fazer isso com uma instrução explícita :

awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
    { if ($1 > $3) $(NF+1) = $1; else $(NF+1) = 1 - $1 } 1' file

informação relacionada