Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在TCL/PERL中以表格格式打印_File_Perl_Tcl - Fatal编程技术网

File 在TCL/PERL中以表格格式打印

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

我在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  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文件通常对机器消耗有好处,但对人类可读性没有好处,因为使用空格的固定宽度格式效果更好。