当Tcl在终端中运行但无法在Tcl脚本中运行时,我无法从Tcl中的awk
命令读取字段。
尝试更改语法,它可以在终端中运行,而不是在脚本中运行
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 /'”
答案 0 :(得分:1)
您的问题是Tcl在'
字符上完全没有特殊含义。出于相同的目的,它使用{
…}
(嵌套效果更好)。您的命令:
exec cat cells.txt | awk ' $1 ~ /^$b/ '
应成为:
exec cat cells.txt | awk { $1 ~ /^$b/ }
除了……,您还希望在其中替换$b
(但不要替换$1
)。最简单的方法是使用format
:
exec cat cells.txt | awk [format { $1 ~ /^%s/ } $b]
在此处最好省略cat
的使用:
exec awk [format { $1 ~ /^%s/ } $b] <cells.txt
您知道您的整个脚本可以用纯Tcl编写而无需使用exec
吗?
答案 1 :(得分:0)
无法读取“ 1”:没有这样的变量
(Tcl)错误消息非常有用。 Tcl觉得有责任用Tcl变量1
的值替换为$1
(作为awk脚本一部分的awk的意思)。这是由于awk脚本的报价不正确造成的。同时,您希望从Tcl中替换$b
。
将awk 'print $1 ~ /^$b/'
变成awk [string map [list @b@ $b] {{$1 ~ /^@b@/}}]
。大括号将排除$1
的Tcl替换,@b@
早已被[string map]
取代了。{p>
exec cat cells.txt | awk [string map [list @b@ $b] {{$1 ~ /^@b@/}}]
这样写,我看不出你为什么在grep
,awk
等和Tcl之间来回移动。所有这些都可以仅在Tcl中完成。