运行 shell 脚本以获取文件输出并将其转换为 Excel 格式

运行 shell 脚本以获取文件输出并将其转换为 Excel 格式

test1.txt我在两个名为和的不同文件中有数据test2.txt,例如:

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

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

我想使用如下 shell 脚本打印这些行:

 1
 xxxx 
 33
 mtech
 2
 yyyy
 22
 bsc

然后我想将此输出转换为 Excel 格式。格式如下所示:

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

我怎样才能像这样转换?

答案1

使用 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.txttest2.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

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  

相关内容