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
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
.
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
==
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.
$ 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
Tags text-processing debian awk linux columns