如何修复Tcl中正在执行的awk?

如何修复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

当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 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变量中。