如何修复Tcl中正在执行的awk?
当Tcl中的如何修复Tcl中正在执行的awk?,awk,tcl,Awk,Tcl,当Tcl中的awk命令在终端中运行而不是在Tcl脚本中运行时,我无法从该命令中读取字段 尝试进行语法更改,但它在终端而不是脚本中工作 set a { A B C D E F G H I J K L M N O P Q R S T U V W X Y Z } #store only cell var in file exec grep -in "cell (?*" ./slow.lib | cut -d "(" -f2 | cut -d ")" -f1 > cells.txt #take
awk
命令在终端中运行而不是在Tcl脚本中运行时,我无法从该命令中读取字段
尝试进行语法更改,但它在终端而不是脚本中工作
set a { A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }
#store only cell var in file
exec grep -in "cell (?*" ./slow.lib | cut -d "(" -f2 | cut -d ")" -f1 > cells.txt
#take alphabets to loop
foreach b $a {
puts "$b\n"
if { [ exec cat cells.txt | awk ' $1 ~ /^$b/ ' ] } {
foreach cell [exec cat ./cells.txt] {
puts "$b \t $cell"
}
}
该条件应检查文件中的第一个字符,并给出布尔值。
错误是:
无法读取“1”:没有此类变量
执行“exec cat cells.txt|awk'$1~/^$b/”时
您的问题是Tcl对
“
字符没有任何特殊意义。它使用{
..}
(哪种嵌套更好)来达到相同的目的。你的命令:
exec cat cells.txt | awk ' $1 ~ /^$b/ '
应成为:
exec cat cells.txt | awk { $1 ~ /^$b/ }
除了……您还希望在其中替换$b
(但不是$1
)。最简单的方法是使用格式:
exec cat cells.txt | awk [format { $1 ~ /^%s/ } $b]
在这里省略cat
更为理想:
exec awk [format { $1 ~ /^%s/ } $b] <cells.txt
exec awk[格式{$1~/^%s/}$b]
无法读取“1”:没有此类变量
(Tcl)错误消息信息非常丰富。Tcl认为有责任用Tcl变量1
的值替换$1
(作为awk脚本的一部分用于awk)。这是由于不正确引用您的awk scriplet。同时,您希望从Tcl内部替换$b
将awk'print$1~/^$b/'
转换为awk[字符串映射[list@b@$b]{{{$1~/^@b@/}]
。花括号将阻止Tcl替换$1
,@b@
将在awk看到它之前被替换,这多亏了[string map]
exec cat cells.txt | awk [string map [list @b@ $b] {{$1 ~ /^@b@/}}]
写这篇文章时,我不明白你为什么要在grep
、awk
等和Tcl之间来回走动。所有这些都可以在Tcl中单独完成。我建议使用awk的-v选项将数据从外部传递到awk变量中。