Por que os campos não são separados por um espaço em branco na saída deste exemplo?

0

Ao aplicar

awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0}'

para inserir

Statements and Functions/399,Black,notBold

por que a saída

Statements and Functions/402,Black,notBold

em vez de

Statements and Functions 402 Black notBold

?

  1. -F'[,/]' altera o separador de campo FS para , ou / , para o awk ler a entrada.

    OFS é, por padrão, um espaço em branco. Então, quando print $0 , não são todos campos $1 , ... e $NF unidos ao separador OFS para criar $0 ?

  2. Alterar

    awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0}'
    

    para

    awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); $1=$1; print $0}'
    

    irá produzir

    Statements and Functions 402 Black notBold
    

    para entrada

    Statements and Functions/399,Black,notBold
    

    Então, quais são todos os outros casos (além de atribuir a um campo) para que $0 será reformatado com OFS ?

  3. Se um campo precisar ser alterado para que $0 seja reformatado com OFS , então por que quando

    awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); print $0;  print $2;  print $0}'
    

    aplica-se à entrada

    Statements and Functions/399,Black,notBold
    

    a saída mostra que o valor de $2 muda, enquanto $0 permanece não afetado por OFS ?

    Statements and Functions/402,Black,notBold
    402
    Statements and Functions/402,Black,notBold
    
por Tim 18.07.2017 / 05:11

2 respostas

1

Você precisa convencer awk de que os campos foram alterados para forçá-lo a reformatá-los com OFS . Se você fizer uma substituição no total $0 como no seu caso, então awk não vê a necessidade de dividi-lo em partes e reformatar novamente.

Você pode fazer algo assim para aceitar que as coisas mudaram:

awk -F'[,/]' '{sub(/\/[0-9]+/, "/" ($2+3) ); $1=$1; print $0}'

O $1=$1 faz o truque:)

Observe que sub() não altera $2 - varre e altera $0 e atualiza-o com o valor de $2+3 . Mas não atualiza $2 , atualiza $0 , portanto, não aciona a reformatação.

    
por 18.07.2017 / 05:29
1

Acredito que você será mais bem atendido usando:

awk -F'[,/]' '{$2=($2+3)}1' infile

com o infile assim:

$ cat infile
The Ubiquitous Backslash/49,Black
The Ubiquitous Backslash/17,Black
Statements and Functions/399,Black,notBold

Você receberá:

$  awk -F'[,/]' '{$2=($2+3)}1' infile
The Ubiquitous Backslash 52 Black
The Ubiquitous Backslash 20 Black
Statements and Functions 402 Black notBold

HTH

    
por 18.07.2017 / 06:30