Para converter todos os campos do nth para o mth em um comando awk
, você não deve codificar os valores; você deve usar um loop "for":
awk 'BEGIN { FS = ","; OFS = ","} {for (i = 3; i <= 4; i++) { $i = "" }; print}' inputfile
Se você deseja excluir um intervalo diferente, ajuste os valores "3" e "4" no código acima.
Explicação:
O bloco BEGIN { ... }
é processado antes de olhar para qualquer uma das linhas do arquivo.
OFS
define o separador de campo de saída e FS
define o separador de campo para entrada. Queremos que ambos sejam vírgulas.
O loop for
é como a sintaxe C. Nesse caso, ele executa o seguinte { code block }
para i
como 3 e como 4.
O $i
merece menção porque é totalmente diferente da sintaxe do shell. No shell script, o nome de uma variável deve ser prefixado com $
para expandir para o valor da variável. Não é assim em awk
. Em awk
, i
por si só se expande para seu valor - 3 ou 4 neste caso - e o $
seguido por um número significa o campo nessa posição numerada. Portanto, $i = ""
define o campo i
th como uma string em branco.
Em seguida, o comando print
, fornecido sem argumentos, padroniza a impressão da linha inteira. Na verdade, ele usa todos os campos da linha delimitados por FS
e, conforme modificado por qualquer comando anterior, imprime todos eles, separados por OFS
e seguidos por uma nova linha no final.
Um comando mais curto equivalente:
Eu sinto que o comando acima é o mais limpo e mais facilmente extensível se você for incluí-lo em um script. É muito explícito sobre o que está fazendo e muito legível. Além disso, tudo pode ser dividido em um script awk
autônomo sem alteração; algo que não pode ser feito automaticamente ao usar -v
e -F
alterna para a invocação awk
. (Isso não é razão para não usá-los, é claro. Apenas algo para estar ciente.)
Para um uso único, especialmente, eu usaria o seguinte:
awk -F, -v OFS=, '{for (i = 3; i <= 4; i++) { $i = "" }; print}' inputfile
A opção -F
define o valor de FS
. A opção -v
permite que você defina valores de awk
variables na linha de comando.
Em uma nota mais geral, a opção -v
pode ser extremamente útil para passar variáveis de shell como variáveis awk: -v myawkvar="$myshellvar"
e para alterar o comportamento de tempo de execução de um script awk
independente extraído de um arquivo de script com a opção -f scriptname
na linha de comando.