File 在TCL/PERL中以表格格式打印
我在tcl中有一个脚本,其中一个变量在每个循环中获取一组数据,并附加到一个文件中。假设在循环1中File 在TCL/PERL中以表格格式打印,file,perl,tcl,File,Perl,Tcl,我在tcl中有一个脚本,其中一个变量在每个循环中获取一组数据,并附加到一个文件中。假设在循环1中 $var = {xy} {ty} {po} {iu} {ii} 在循环2中 $var = {a} {b} {c} {d1} {d2} {e3} 现在,在文件f.txt中,变量已转储。Like将$file$var放入文件中,它如下所示: 第1行:{xy}{ty}{po}{iu}{ii} 第2行:{a}{b}{c}{d1}{d2} 我想把它们最终打印成表格格式的文件。如下图所示: xy a ty
$var = {xy} {ty} {po} {iu} {ii}
在循环2中
$var = {a} {b} {c} {d1} {d2} {e3}
现在,在文件f.txt中,变量已转储。Like将$file$var放入文件中,它如下所示:
第1行:{xy}{ty}{po}{iu}{ii}
第2行:{a}{b}{c}{d1}{d2}
我想把它们最终打印成表格格式的文件。如下图所示:
xy a
ty b
po c
iu d1
ii d2
试试这个:
$ perl -anE 'push @{$vars[$_]}, ($F[$_] =~ s/^[{]|[}]$//gr) for 0.. $#F; END {say join "\t", @$_ for @vars}' f.txt
xy a
ty b
po c
iu d1
ii d2
命令行开关:
- -a:在空白处启用自动拆分以
数组@F
- -n:循环输入文件中的行,将
数组设置为当前行上的字@F
- -E:将以下参数作为一行执行
$F[$\]=~s/^[{]\[}]$///gr
:全局替换(我们希望同时删除g
和{
)}
:非破坏性操作,返回替换结果,而不是修改r
@F
set f[打开“f.txt”]
set words1[regexp-all-inline{\S+}[获取$f]]
set words2[regexp-all-inline{\S+}[获取$f]]
收盘价$f
这里的技巧是regexp-all-inline
返回所有匹配的子字符串,\S+
选择非空白字符序列
然后,因为我们正在生成表格输出,所以需要测量第一个列表中项目的最大大小。我们不妨同时测量第二个列表
set len1[tcl::mathfunc::max{*}[lmap w$words1{string length$w}]
set len2[tcl::mathfunc::max{*}[lmap w$words2{string length$w}]]
lmap
将字符串长度
应用于每个单词,然后我们找到它们的最大值<代码>{*}将列表(字长)替换为多个参数
现在,我们可以迭代两个列表并生成格式化输出:
foreach w1$words1 w2$words2{
放入[格式“%-*s%-*s”$len1$w1$len2$w2]
}
格式序列%-*s
使用两个参数,一个是字段长度,另一个是要放入该字段的字符串。它将字段内的值左对齐,并在右侧填充空格。如果没有-
,它将右对齐;这对整数更有用。您可以改为使用制表符进行分隔,如果单词较短,这通常效果很好,但如果长度混合较宽,效果就不太好了
如果您希望生成一个实际的制表符分隔值文件,Tcllib中的
csv
包将使用正确的(明显的!)选项生成这些值 这些牙套是怎么回事?这是您的数据吗?是的,数据带有大括号。您所说的“TCL/PERL”是什么意思?TSV文件通常对机器消耗有好处,但对人类可读性没有好处,因为使用空格的固定宽度格式效果更好。