web-dev-qa-db-ja.com

シェルスクリプトを実行してファイルの出力を取得し、Excel形式に変換します

次のようなtest1.txttest2.txtという2つの異なるファイルにデータがあります。

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

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

次のようなシェルスクリプトを使用してこれらの行を印刷します。

 1
 xxxx 
 33
 mtech
 2
 yyyy
 22
 bsc

そして、この出力をExcel形式に変換したいと思います。形式は次のようになります。

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

このように変換するにはどうすればよいですか?

2
Beginner

Perl + ssconvertgnumericパッケージ内)を使用:

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

Perlコマンドは、レコード区切り文字として空白行を使用し、フィールド区切り文字として改行文字を使用して、test1.txtおよびtest2.txtを読み取ります。ヘッダー(Id,Name,Age,Education)を印刷し、各レコードについて、各フィールドについて、各フィールドの最初の:文字に続くスペースのシーケンスに続く最初の文字の前のすべてを削除し、フィールドとしてコンマを使用してレコードを印刷しますレコードセパレータとしてのセパレータと改行文字(つまり、test1.txtおよびtest2.txtを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

ssconvertコマンドは、STDINから読み取り、ファイルをExcelスプレッドシートに変換します。

gnumericをインストールしてssconvertを取得するオプションがない場合、Perlコマンドを使用してCSVをExcelなどにインポートできます。

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
2
kos
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

@kosが提示したように、異なる形式の世界に変換することができます...

ssconvert out.tsv out.tex
ssconvert out.tsv out.pdf  
1
user216043