Sua sintaxe está quase correta. Para testar a igualdade de strings em awk
, use um sinal de igual duplo: ==
. Para atribuir um valor , use um único sinal de igual.
Portanto, use if ($4 == "E:")
e você deve obter o resultado desejado.
O comando completo ficaria assim. Note que há apenas uma diferença de caractere do comando que você usou; esse foi seu único erro:
awk -F , '{ if ($4 == "E:") $4="";}1' OFS=, data.final
Para mostrar algumas sintaxes e abordagens diferentes, as seguintes versões são exatamente equivalentes:
awk -F, -v OFS=, '$4 == "E:" { $4 = "" }; 1' data.final
awk 'BEGIN { FS=OFS="," }; $4 == "E:" { $4 = "" }; {print}' data.final
awk -F, -v OFS=, '{sub( /^E:$/, "", $4); print}' data.final
Notas sobre o acima:
- Se todo o seu bloco de código é apenas um if / then, você pode simplesmente usar a condição como um filtro para o bloco de código. Portanto,
$4 == "E:" {$4 = ""}
é exatamente equivalente a{if ($4 == "E:") {$4 = ""}}
- É uma boa prática incluir instruções "then" em um bloco de código mesmo quando houver apenas uma delas, ou seja,
if ($4 == "E:") {$4 = ""}
em vez deif ($4 == "E:") $4 = "";
-
-F
define o valor deFS
e-v
pode ser usado para definir o valor de qualquer variável antes queawk
considere a primeira linha do primeiro arquivo. (Você provavelmente sabia disso.) Você também pode usar um blocoBEGIN
para fazer a mesma coisa; vale a pena saber quando você deseja tornar o scriptawk
autônomo. - O motivo pelo qual
1
imprime linhas emawk
é que é uma condição (um filtro) que sempre é avaliada como true e a ação padrão emawk
quando nenhum bloco de código é anexado ao filtro é %código%. Portanto,print $0
é equivalente a1
ou1 {print}
ou apenas1 {print $0}
. - Na minha última variação, usei uma função
{print}
para substituir o regexsub
(início da sequência,/^E:$/
, fim da sequência) porE:
in""
.
Como a função $4
retorna o número de substituições feitas (1 ou 0; use sub
para fazer mais de uma substituição), você pode codificar esse problema adicionando um à função gsub
resultado para garantir que você tenha um padrão que seja sempre verdadeiro para que a linha resultante seja impressa se uma substituição é feita ou não. Aqui está a versão do código de golfe, não recomendado para uso iniciante se você está colocando isso em um script que você irá manter:
awk -F, -v OFS=, 'sub(/^E:$/,"",$4)+1' data.final
:)