imprimir em reverso sem arrastar

1

Eu tenho um arquivo bash chamando uma zona dns e canalizei o fqdn que eu preciso exportar na ordem inversa.

O snippet abaixo faz isso bem, exceto que eu recebo um trial . no final que eu não quero criar um formato import, csv (delimitador de vírgula):

... | awk -F'.' '{for (i=NF;i>0;i--){printf $i"."};printf "\n"}' 

fonte de exemplo:

abc.def,ghi.com
hjd.dhjs.dhuj.oiuehj.ksjdhf.com

resultados desejados:

com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd

resultados atuais:

com.ghi.def.abc.
com.ksjdhf.oiuehj.dhuj.dhjs.hjd.
    
por carter 16.10.2014 / 00:36

2 respostas

2

Aqui está uma abordagem:

awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}' 

Uso da amostra:

$ echo abc.def.ghi.com | awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}' 
com.ghi.def.abc

Explicação:

  • for (i=NF;i>1;i--){printf $i"."

    Isso imprime as partes na ordem inversa, iniciando em $NF e parando em $2 (o segundo campo), com cada parte seguida por um ponto.

  • print $1

    Isto imprime a parte final sem um período posterior. Como print é usado aqui, em vez de printf , não há necessidade de uma nova linha explícita.

Alternativa

Para variedade, aqui está outra solução:

awk -F'.' '{s=""; for (i=NF;i>0;i--){s=s"."$i};print substr(s,2)}'

Isso usa a mesma lógica da postagem original: um loop sobre todas as partes. Em vez de imprimir em cada etapa, no entanto, isso salva a saída desejada na string s . No final, imprime s , exceto pelo último caractere que seria o período supérfluo.

Alternativa usando tac em vez de awk

$ echo abc.def.ghi.com | tr '.' '\n' | tac | tr '\n' '.' | sed 's/\.$/\n/'
com.ghi.def.abc

Ou ainda mais simples:

$ echo  abc.def.ghi.com | tac -s'[.\n]' 
abc.def.ghi.com
    
por 16.10.2014 / 00:46
0

Você também pode usar printf com outra variável: o caractere a ser impresso depois de cada campo.

$ awk -F"[.,]" '{for (i=NF;i>0;i--) printf "%s%s", $i, (i==1?"\n":".")}' file
com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd
  • -F"[.,]" define o separador de campo como . ou , . Desta forma, cada palavra contará como um campo diferente.
  • (i==1?"\n":".") significa: no caso i é 1 , use \n ; caso contrário, use . .
por 16.10.2014 / 14:23

Tags