
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 awk
funciona 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 awk
script 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 1
no 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).
if
Obviamente, 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