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 = ""; -
-Fdefine o valor deFSe-vpode ser usado para definir o valor de qualquer variável antes queawkconsidere a primeira linha do primeiro arquivo. (Você provavelmente sabia disso.) Você também pode usar um blocoBEGINpara fazer a mesma coisa; vale a pena saber quando você deseja tornar o scriptawkautônomo. - O motivo pelo qual
1imprime linhas emawké que é uma condição (um filtro) que sempre é avaliada como true e a ação padrão emawkquando nenhum bloco de código é anexado ao filtro é %código%. Portanto,print $0é equivalente a1ou1 {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
:)