Execute o shell script para obter a saída de um arquivo e convertê-lo no formato Excel

3

Eu tenho dados em dois arquivos diferentes chamados test1.txt e test2.txt , como:

ID : 1
Name: xxxx
Age: 33
Education: Mtech

ID: 2
Name: yyyy
Age: 22
Education: bsc

Eu quero imprimir essas linhas usando um script de shell como este:

 1
 xxxx 
 33
 mtech
 2
 yyyy
 22
 bsc

e, em seguida, quero converter essa saída em formato Excel. O formato parece abaixo:

 ID Name    Age Education
 1  xxx     33  mtech
 2  yyy     22  bsc

Como posso converter assim?

    
por Beginner 02.03.2016 / 08:53

2 respostas

3

Usando Perl + ssconvert (no pacote gnumeric ):

perl -F'2' -00ane 'BEGIN {$, = ","; $\ = "\n"; print("ID,Name,Age,Education")} my @f; foreach(@F) {s/.*?: +//; push(@f, $_)} print(@f)' test1.txt test2.txt | ssconvert fd://0 output.xls

O comando Perl lê test1.txt e test2.txt usando linhas em branco como separadores de registro e um caractere de nova linha como separadores de campo; ele imprime o cabeçalho ( Id,Name,Age,Education ) e para cada registro e para cada campo retira tudo antes do primeiro caractere após a seqüência de espaços após o primeiro caractere : de cada campo e imprime o registro usando vírgulas como separadores de campo e uma nova linha caractere como separadores de registro (isto é, converte test1.txt e test2.txt em um CSV):

% cat test1.txt
ID : 1
Name: xxxx
Age: 33
Education: Mtech

ID: 2
Name: yyyy
Age: 22
Education: bsc
% cat test2.txt
ID : 3
Name: xxxx
Age: 33
Education: Mtech

ID: 4
Name: yyyy
Age: 22
Education: bsc
% perl -F'2' -00ane 'BEGIN {$, = ","; $\ = "\n"; print("ID,Name,Age,Education")} my @f; foreach(@F) {s/.*?: +//; push(@f, $_)} print(@f)' test1.txt test2.txt
ID,Name,Age,Education
1,xxxx,33,Mtech
2,yyyy,22,bsc
3,xxxx,33,Mtech
4,yyyy,22,bsc

O comando ssconvert lê a partir de STDIN e converte o arquivo para uma planilha do Excel.

Se a instalação de gnumeric para obter ssconvert não for uma opção, você poderá usar apenas o comando Perl e importar o CSV para o Excel / qualquer que seja:

perl -F'2' -00ane 'BEGIN {$, = ","; $\ = "\n"; print("ID,Name,Age,Education")} my @f; foreach(@F) {s/.*?: +//; push(@f, $_)} print(@f)' test1.txt test2.txt >output.csv
    
por kos 02.03.2016 / 10:24
1
awk 'NR==1{print ,,,}
          {print ,,,}' FS='[\n:] *' OFS='\t' RS='' t*.txt > out.tsv

gnumeric out.tsv    #  excel or libreoffice, whatever

E como o @kos apresentou, podemos transformá-lo em um mundo de formatos diferentes ...

ssconvert out.tsv out.tex
ssconvert out.tsv out.pdf  
    
por JJoao 04.03.2016 / 12:25