usa o awk para substituir parênteses?

5

Como posso usar o awk para substituir os parênteses nesses dois cenários?

  1. Altere os parênteses vazios para a palavra "Nenhum"

    192.168.0.24, Up, ()

  2. Remova parentes para somente host.domain.com é deixado

    192.168.0.25, Up, (host.domain.com)

por LVLAaron 03.01.2012 / 21:09

2 respostas

2

com sed:

echo -e "192.168.0.25,Up,()\n1.2.3.4,Up,(host.domain.com)" | 
    sed 's/()/None/g;s/[()]//g'
192.168.0.25,Up,None
1.2.3.4,Up,host.domain.com

Aqui está um programa do awk:

BEGIN {FS=","}
$3 ~ /\(\)/   { printf ($1","$2",None\n"); next }
$3 ~ /\(.+\)/ { 
                  gsub ("\(", "")
                  gsub ("\)", "")
              }
              { printf ($0"\n") }

chame-o com

echo -e "1.8.0.5,Up,()\n1.2.3.4,Up,(host.d.com)" | awk -f ip.awk 

por exemplo.

    
por 03.01.2012 / 21:24
2

Isso deve funcionar -

awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' INPUT_FILE

Explicação:

  1. Nós definimos o separador de campo como , e o separador de campo de saída como , . A configuração do OFS nos dá a liberdade de evitar a impressão explícita de seus separadores de campo desejados.

  2. Verificamos se há um padrão $NF=="()" (onde $ NF é o último campo), se for verdade, imprimimos o primeiro e o segundo campo e imprimimos NONE como o último campo. Como seus dados de amostra só tinham três campos, essa abordagem deve estar correta. No entanto, se você tiver mais de cinco campos, usar um for loop simples seria ideal. Apenas certifique-se de que o for loop funcione como i=1;i<NF;i++ desta maneira você pode colocar manualmente o campo final. Também usamos a palavra-chave next para passar para a próxima linha, pois não queremos que a segunda ação seja executada na primeira linha.

  3. A segunda declaração de ação é verdadeira para todas as linhas que não correspondem à primeira. Aqui estamos usando uma função interna de substituição global que substitui o brackets por nada.

Espero que isso ajude!

Teste:

[jaypal:~/Temp] cat file
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.24,Up,()
192.168.0.24,Up,()
192.168.0.25,Up,(host.domain.com)
192.168.0.25,Up,(host.domain.com)

[jaypal:~/Temp] awk -F"," -v OFS="," '
$NF=="()" {print $1,$2,"NONE";next}
{gsub(/\(|\)/,"",$NF);print}' file
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.24,Up,NONE
192.168.0.24,Up,NONE
192.168.0.25,Up,host.domain.com
192.168.0.25,Up,host.domain.com
    
por 04.01.2012 / 20:15