Ajuda com o script para processar o arquivo txt para CSV

1

Estou tentando / tentando escrever um script para transformar isso:

Mikrotik01#show unique routing entry | 192.168.255.232 | inc ID
Thu June 10 15:21:32.808 CST
 Unique Entry: 192.168.255.21
 Unique Entry: 192.168.255.233
 Unique Entry: 192.168.255.155
Mikrotik01#show unique routing entry | 192.168.255.233 | inc ID
Thu June 10 15:21:33.079 CST
 Unique Entry: 192.168.255.234
 Unique Entry: 192.168.255.232
Mikrotik01#show unique routing entry | 192.168.255.234 | inc ID
Thu June 10 15:21:33.347 CST
 Unique Entry: 192.168.255.233
 Unique Entry: 192.168.255.235

Em um CSV que contém:

192.168.255.232,192.168.255.21,192.168.255.233,192.168.255.155
192.168.255.233,192.168.255.234,192.168.255.232
192.168.255.234,192.168.255.233,192.168.255.235

Basicamente, ele iniciará uma nova linha com a primeira linha e, em seguida, adicionará cada uma das ID do roteador na mesma linha com uma vírgula até atingir a próxima linha que contém o "Mikrotik" hostname onde criaria uma nova linha e continuaria pelo arquivo inteiro. Resultado final em um csv.

Eu tenho olhado para isso o dia todo e estou apenas preso. Qualquer sugestão seria ótima e muito apreciada. Mesmo uma sugestão na direção certa.

    
por SpunKnibbles 15.01.2015 / 23:10

2 respostas

1

awk -F'[[:blank:]|]+' '
    /^Mikrotik01/ {if (NR>1) print ""; printf "%s", $(NF-2)} 
    /Unique Entry/ {printf ",%s", $NF}
    END {print ""}
' file.txt > File.csv
    
por 16.01.2015 / 01:10
0

No primeiro fechamento, pode ser sed -script:

sed -E '
/Mikrotik01/{s/.* ([0-9.]{7,}) .*//;x;/^$/!b}
/[0-9.]{7,}/!d
s/.* ([0-9.]{7,}).*//
x
G
s/\n/,/
h
$!d' file.txt > file.csv

Ou (pode ser mais curto, mas não tão strong - ele reconhece um novo bloqueio de linha em | , não em Mikrotik01 )

sed -E '
  /^T/d
  s/^[^.]*[|:] //
  / \|.*$/{s///;x;/^$/!b}
  x
  G
  s/\n/,/
  $!{h;d}' file.txt > file.csv

Pode ser simplificado (porque eu faço duas vezes mesmo x e s/ ) mas agora não consigo imaginar como.

    
por 16.01.2015 / 01:17