Insira uma quebra de linha antes de um campo numérico ou antes de um campo alfanumérico que esteja logo após um campo numérico

0

Eu tenho essa linha

word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5

Eu quero dividir essa linha para inserir uma quebra de linha antes de um campo numérico ou antes de um campo alfanumérico que esteja logo após um campo numérico, então a saída seria:

word1 word2
1234
4567
word3
8901
word4 word5
2541 
5142 
word5

Todos os campos alfanuméricos começam com letras

    
por Emilio Galarraga 29.10.2018 / 23:46

3 respostas

1

Parece que você quer preservar espaços entre palavras alfanuméricas e converte todos os outros em novas linhas, então talvez:

perl -pe 's{([^\d\s]\S*\s+)(?=\S*[^\d\s])|\s+}{$1//"\n"}ge'
    
por 30.10.2018 / 14:12
1
echo "word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5" |perl -pe 's/(\s)([0-9]+)/$1\n$2/g; s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g;'

Explicação:

  • perl -pe : execute o seguinte script Perl em cada linha de entrada e resultados de impressão
  • s/(\s)([0-9]+)/$1\n$2/g : espaço em branco + campo numérico - > espaço em branco + nova linha + campo numérico
  • s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g : espaço em branco + numérico campo + espaço em branco + campo alfanumérico - > espaço em branco + campo numérico + nova linha + campo alfanumérico
  • o g no final de cada substituição significa 'global' - faça isso para toda a linha
por 30.10.2018 / 12:45
1

Coloque o seguinte código em um script awk. Digamos que o script seja chamado de do_magic.awk

#!/usr/bin/awk -f

{
  str=$1
   for (i=2;i<=NF;++i) 
      if ($i ~ /^[0-9]+/) str = str "\n" $i "\n"
      else str = str " " $i
       gsub(/\n[[:space:]]*/,"\n",str)
       print str
}

Chame o script usando

do_magic.awk yourfile

O resultado é:

word1 word2
1234
4567
word3
8901
word4 word5
2541
5142
word5

PS: Eu tive alguma solução de trabalho, pensei. No freenode #awk, geirha forneceu a resposta completa. Então os créditos vão para ele!

    
por 30.10.2018 / 13:27