我在tcl中有一个脚本,其中一个变量在每个循环中获取数据集合并追加到文件中。假设在loop1中,
$var = {xy} {ty} {po} {iu} {ii}
和在loop2
$var = {a} {b} {c} {d1} {d2} {e3}
现在在文件f.txt中转储变量。就像放$ file $ var一样。并在文件中是这样的:
第1行:{xy} {ty} {po} {iu} {ii}
第2行:{a} {b} {c} {d1} {d2}
我想最终将它们以表格格式打印在文件中。如下所示:
xy a
ty b
po c
iu d1
ii d2
答案 0 :(得分:1)
首先,读入文件并提取前两行中的单词:
set f [open "f.txt"]
set words1 [regexp -all -inline {\S+} [gets $f]]
set words2 [regexp -all -inline {\S+} [gets $f]]
close $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
将string length
应用于每个单词,然后我们找到它们的最大值。 {*}
将列表(单词长度)替换为多个参数。
现在,我们可以遍历两个列表并生成格式化的输出:
foreach w1 $words1 w2 $words2 {
puts [format "%-*s %-*s" $len1 $w1 $len2 $w2]
}
格式序列%-*s
使用两个参数,一个是字段的长度,另一个是要放入该字段的字符串。它将值在字段内左对齐,并在右边用空格填充。没有-
,它将右对齐;这对于整数更有用。您可以改用制表符来分隔字符,这通常在单词较短的情况下效果很好,但是一旦您获得更大的长度组合,效果就不太好了。
如果您要生成实际的制表符分隔的值文件,则Tcllib中的csv
包将使用正确的(显而易见的!)选项来生成这些文件。
答案 1 :(得分:0)
尝试一下:
$ 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