como usar o gsub com o awk para aplicar em todas as strings

1

Estou tentando usar gsub com awk para aplicar em todas as strings, mas falhei.

gsub(/^ *| *$/,"", $4);

em vez de aplicar isso para a string $4 , gostaria de aplicá-lo com todas as strings. Eu tentei com $0 mas falhei.

Por favor, informe qual é o meu erro?

awk '{ 
     split($12, a, /[/:]/); 
     if (length(a[2]) == 1) $12=sprintf("%s:%02d/%d", a[1], a[2], a[3]);
     gsub(/^ *| *$/,"", $0);
     print $9, $12, $10, $2, $3, $4, $5, $6, $7, $8, $13 
 }' FS='|' OFS=',' file

EXEMPLO

|f_name:x|l_name:x| address:x x | city:x |state:x|zip:x|country:x|ordernumber:x|code:x|downloaded:x| exp:9/2017|ip:x.x.x.x|

Resultado

ordernumber:x,exp:09/2017,code:x,f_name:x,l_name:x,address:x x,city:x,state:x,zip:x,country:x,ip:x.x.x.x
    
por αԋɱҽԃ αмєяιcαη 20.12.2017 / 18:37

2 respostas

1

Faça um loop de 1 para NF e consulte o campo com $i (ou o que você usa para nomear o contador de loops). A sintaxe é semelhante a C:

for (i = 1 ; i <= NF ; i++) {
    ...
}

Por exemplo,

$ echo "  foo bar  :doh : bla:" |awk -vOFS=: -F: '
    { for (i = 1 ; i <= NF ; i++) gsub(/^ +| +$/, "", $i) } 1'
foo bar:doh:bla:

(Eu mudei /^ */ para /^ +/ porque mawk parece ignorar o ^ no primeiro.)

    
por 20.12.2017 / 18:55
1

Se tudo o que você está tentando fazer é remover os espaços em branco de cada campo, onde os campos são separados pelo caractere "|", basta alterar o delimitador de campo para incluir esse espaço em branco. Assumindo que seu awk suporta um regexp como separador de campo, substitua sua configuração FS='|' por

FS=' *\| *'

Observe a necessidade de escapar do | , pois as sequências agora são um padrão.

Isso não controla os espaços em branco no início do primeiro campo e o final do último campo. Você pode usar sub(/^ */,"",$1) e sub(/ *$/,"",$NF) nestes.

    
por 20.12.2017 / 19:55

Tags