cria uma nova coluna baseada em colunas existentes usando if else statement no awk

0

Eu tenho um conjunto de dados com > 7 linhas Mio (e, na realidade, > 20 colunas), e gostaria de criar uma nova coluna (o meu exemplo de conjunto de dados tem 5 colunas), então 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, a nova coluna deverá ter o valor da coluna 1; caso contrário, deve ter o valor de "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 .

    
por Chris 23.10.2016 / 20:09

3 respostas

1

Tente isso. Apenas precisei de == substituindo por = e as chaves adicionadas.

awk '{ if ($1 > $3){ $6=$1 }else{ $6=1-$1 } print }' test.txt >test2.txt
    
por 23.10.2016 / 20:25
1

== verifica se o valor de dois operandos é igual ou não, = atribui valores dos operandos do lado direito para o operando do lado esquerdo. As seguintes linhas devem ser trabalho:

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 awk funciona assim:

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

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

    
por 23.10.2016 / 20:48
1
$ 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 script awk tiver adicionado e gerado o novo cabeçalho da coluna, ele começará a calcular o valor da nova coluna para as outras linhas.

O valor é calculado primeiro definindo-o como o valor na coluna 1 e, se a coluna 1 for menor ou igual à coluna 3, é subtraído de 1. O único 1 no final faz com que o registro modificado ( linha) a ser impressa.

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

Você pode obviamente fazer isso com uma declaração if explícita:

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