次のようなtest1.txt
とtest2.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
このように変換するにはどうすればよいですか?
Perl + ssconvert
(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
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
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