J'ai des données dans deux fichiers différents appelés test1.txt
et test2.txt
, comme:
ID : 1
Name: xxxx
Age: 33
Education: Mtech
ID: 2
Name: yyyy
Age: 22
Education: bsc
Je veux imprimer ces lignes en utilisant un script Shell comme ceci:
1
xxxx
33
mtech
2
yyyy
22
bsc
et puis je veux convertir cette sortie au format Excel. Le format ressemble à celui ci-dessous:
ID Name Age Education
1 xxx 33 mtech
2 yyy 22 bsc
Comment puis-je convertir comme ça?
Utilisation de Perl + ssconvert
(dans le package gnumeric
):
Perl -F'\012' -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
La commande Perl lit test1.txt
et test2.txt
en utilisant des lignes vides comme séparateurs d'enregistrement et des caractères de nouvelle ligne comme séparateurs de champ; il imprime l'en-tête (Id,Name,Age,Education
) et pour chaque enregistrement et toutes les bandes de champs, tout ce qui précède le premier caractère suivant la séquence d'espaces suivant le premier :
caractère de chaque champ et imprime l'enregistrement en utilisant des virgules comme champ des séparateurs et un caractère de nouvelle ligne en tant que séparateur d'enregistrement (c.-à-d. qu'il convertit test1.txt
et test2.txt
en un fichier 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'\012' -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
La commande ssconvert
lit à partir de STDIN et convertit le fichier en feuille de calcul Excel.
Si installer gnumeric
pour obtenir ssconvert
n’est pas une option, vous pouvez utiliser uniquement la commande Perl et importer le fichier CSV dans Excel/peu importe:
Perl -F'\012' -00ane 'BEGIN {$, = ","; $\ = "\n"; print("ID,Name,Age,Education")} my @f; foreach(@F) {s/.*?: +//; Push(@f, $_)} print(@f)' test1.txt test2.txt >output.csv
awk 'NR==1{print $1,$3,$5,$7}
{print $2,$4,$6,$8}' FS='[\\n:] *' OFS='\t' RS='' t*.txt > out.tsv
gnumeric out.tsv # Excel or libreoffice, whatever
Et comme @kos a présenté, nous pouvons le convertir en un monde de formats différents ...
ssconvert out.tsv out.tex
ssconvert out.tsv out.pdf