如何修复在Tcl中执行awk?

时间:2019-03-31 16:38:42

标签: awk tcl

当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 /'”

2 个答案:

答案 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@/}}]

这样写,我看不出你为什么在grepawk等和Tcl之间来回移动。所有这些都可以仅在Tcl中完成。