Desejo alterar o separador de campo ( FS
) apenas para um registro específico e desejo que o registro ( $0
), os campos ( $N
) e o número de campos ( NF
) sejam recalculados usando o novo separador de campo. Mas não parece funcionar.
Exemplo: Aqui eu tenho uma única linha que é interpretada como três campos separados por espaços em branco. Se eu mudar o separador de campos para n
e forçar a reconstituição do registro ( $1 = $1
), o registro continua o mesmo, como pode ser visto imprimindo $1
:
$ echo 'one two three' | awk '1 {FS="n" ; OFS=":" ; $1 = $1 ; print $1}'
> one
Mas eu esperaria que a saída fosse:
> o
O truque de forçar o registro a ser reconstituído por execução $1 = $1
é retirado do manual gawk . Então eu esperaria que funcionasse. Não tenho certeza do que poderia ser o problema:
É um erro comum tentar alterar os separadores de campo em um registro simplesmente definindo
FS
eOFS
, e então esperando um simplesprint $0
imprimir o registro modificado.Mas isso não funciona, porque nada foi feito para alterar o registro em si. Em vez disso, você deve forçar a reconstrução do registro, geralmente com uma instrução como
$1 = $1
[...]
(estou usando o GNU Awk 5.2.2)
A respeito de
Seu código pode ser mais claro/simples se você usar
split()
esse registro.Você está misturando 2 conceitos - reconstruir $ 0 e dividir novamente $ 0.
Reconstruindo $0: Quando você modifica ou atribui um valor a um campo, $0 é reconstruído a partir dos campos substituindo cada FS por OFS, por exemplo
Redividindo $ 0: Quando você modifica ou atribui um valor a $ 0 (que não seja como resultado de ter sido reconstruído devido à alteração de um campo), $ 0 é dividido novamente em campos usando o valor FS existente, por exemplo
Agora tente entender os seguintes resultados para ver se você entendeu as afirmações acima:
Reconstruindo e Redividindo:
Redividindo e Reconstruindo:
Olhando ao redor do texto citado, vejo:
Seguido um pouco mais tarde por:
Pela falta de menção
FS
na primeira frase e a ênfase na segunda, acho que a forma esperada é que apenas$0 = $0
fará com que os campos sejam recalculados; os outros apenas farão com que o registro mude para saída de quaisquer que sejam os valores dos campos sem tentar analisá-los:Observe que não estou usando GNU awk:
Mas eu esperaria o mesmo do GNU awk.