我需要将一个变量值传递给tickle中使用的awk命令。 目标:我想在循环中逐个提取文件clk_gate_names的fisrt字段。所以这是一个小例子,显示在一个脚本中使用了相同的概念。
以下一个测试用例:
set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set test [exec awk {NR==${a}{print $1}} clk_gate_names]
}
获得以下错误: awk:NR == $ {a} {print $ 1} awk:^语法错误
请在这里说清楚。在此先感谢:)
答案 0 :(得分:2)
问题是你想要混合来自Tcl的变量和来自Awk的变量。这有点复杂,因为它们必然是单独的进程。
一种选择是使用Tcl的format
命令来构建Awk脚本 - 。
set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set awkcode [format {NR==%d {print $1}} $a]
set test [exec awk $awkcode clk_gate_names]
}
但是,更好的方法是通过-v
选项传递变量。这样做的好处是不会被任何奇怪的引用搞错,并且Tcl不会意外地破坏单词(除了在exec
中,当它看起来像文件/管道重定向时;这是一个疣)。 / p>
set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set test [exec awk -v a=$a {NR==a {print $1}} clk_gate_names]
}
第三种方式是use an environment variable。这样做的好处是不易受重定向问题的影响(因此您可以传入包含>
的值)。
set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set env(A_FROM_TCL) $a
set test [exec awk {NR==$ENVIRON["A_FROM_TCL"] {print $1}} clk_gate_names]
}
备注:强>
foreach
的语法?出于我们在这里讨论的目的,它并不重要,但如果您发布的代码正好您正在使用的内容,那么您可能会遇到问题... 答案 1 :(得分:0)
尝试以下逻辑 -
awk -v a=1 'NR==a {print $1}' f
根据您的代码 -
set a 0
incr a
foreach i {0.. 11} { # i variable is used for another thing
set test [exec awk -v a="$a" 'NR==a {print $1}' clk_gate_names]
}
让我知道它是否满足您的要求。并共享输出(所需的输出/错误)
答案 2 :(得分:0)
awk -v a=${a} "NR==a{print \$1}" filename
检查:
http://phaseit.net/claird/comp.lang.tcl/fmm.html
AWK:谁是谁awk'{print $ 1}'可以从命令行工作,但我的Tcl解释器拒绝exec谁| awk'{print $ 1}'我经常听到 来自尚未学会要求tclsh解释的人 执行谁| awk {{print $ 1}}请注意'-s不是'关于'awk; 它们只是壳中最常见的引用 经常访问awk。 exec不使用shell。 {}表演 引用Tcl的类似函数。更多的例子出现在这里 谷歌线程。 Alexandre Ferrieux给出了正确而简洁的说法 在另一个线程中解释。他遇到的问题恰巧发生了 做sed,但这基本上是无关紧要的;命令行 awk和sed的语法表现出相同的症状。简而言之,作为 自己出现的错误消息说,单引号(')是 问题。这些是字符串的shell标记,不应该是 取代。 / bin / sh和其他人在调用awk之前删除了这个标记。
相反,在Tcl中,大括号{}起着同样的作用。大括号有 它们可以嵌套的优点。一个结论:支撑牙箍 awk期望:awk -F“”{{print $ 1}}。请注意,在这最后,它 没有必要逃脱美元符号,因为外支撑 保护它。
Richard Suchenwirth多次写过, Mark Janssen,Kevin Kenny和其他人;这不太可能 表达是孤立发明的。