Como entender o comando awk '{para (x = 1; x = NF; x ++) se ($ x ~ / 0.00000 /) {sub (/0.00000 /, ++ i)}} 1' arquivo

0

Quanto a este comando:

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'

Eu sei que este comando irá procurar por "0.00000" em um arquivo e substituí-lo por um número incremental a partir de 1. Eu entendi quase tudo, exceto para 'x < = NF' e o número 1 no final "{sub ( /0.00000/,++i)}}1 'Você pode me esclarecer sobre esses dois pontos, por favor?

Além disso, se eu quiser fazer a mesma coisa, mas substituindo a correspondência por um número incremental a partir de 0, seria correto fazer:

awk '{for(x=0;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' file
    
por FZJ 11.10.2018 / 21:03

2 respostas

3

NF é uma variável interna do Awk cujo valor é definido para o número de campos no registro atual. Então

for(x=1;x<=NF;x++)

está circulando por todos os campos. O número 1 no final da expressão é uma forma abreviada de imprimir todo o registro, fazendo uso da ação padrão quando um padrão avalia "verdadeiro":

In an awk rule, either the pattern or the action can be omitted, but not both. If the pattern is omitted, then the action is performed for every input line. If the action is omitted, the default action is to print all lines that match the pattern.1

Para iniciar o número incremental de 0 em vez de 1 , você pode substituir o prefixo ++i pelo postfix i++ :

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'

ex.

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'
foo 1123 bar

enquanto

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'
foo 0123 bar
$
  1. O guia do usuário do GNU Awk: 1.3 Alguns exemplos simples
por 11.10.2018 / 21:29
0

Pode valer a pena mencionar que

sub(/0.00000/,i++)

irá substituir a primeira ocorrência na linha inteira ($ 0, o padrão). Por acidente, essa também será a ocorrência em $x . Para torná-lo à prova de falhas e para futura aplicação, substitua-o por

sub(/0.00000/,i++, $x)
    
por 12.10.2018 / 13:18

Tags