在Tcl中执行管道shell命令
我想在Tcl中执行这些管道shell命令:在Tcl中执行管道shell命令,shell,tcl,Shell,Tcl,我想在Tcl中执行这些管道shell命令: grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head 我尝试: exec grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head 并获取一个错误: Error: grep: invalid option -- 'k' 当我尝试通过管道传输命令时,只有两个命令: exec grep -v "#" inputfile
grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head
我尝试:
exec grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head
并获取一个错误:
Error: grep: invalid option -- 'k'
当我尝试通过管道传输命令时,只有两个命令:
exec grep -v "#" inputfile | grep -v ">"
我得到:
Error: can't specify ">" as last word in command
更新:我还尝试了{}和{bash-c'…'}:
exec {bash -c 'grep -v "#" inputfile | grep -v ">"'}
Error: couldn't execute "bash -c 'grep -v "#" inputfile | grep -v ">"'": no such file or directory
我的问题:如何在tcl脚本中执行初始管道命令
谢谢问题出在这里
您需要将它从tcl和shell中解救出来,才能使它在这里工作
exec grep -v "#" inputfile | grep -v {\\>} | sort -r -nk7 | head
或者这更好,因为你少了一个grep
如果您在使用Tcsh或类似工具运行此程序的目录中查找,您可能会看到您创建了一个名称奇怪的文件,即|之前。该>在这里造成了问题
您需要将它从tcl和shell中解救出来,才能使它在这里工作
exec grep -v "#" inputfile | grep -v {\\>} | sort -r -nk7 | head
或者这更好,因为你少了一个grep
如果您在使用Tcsh或类似工具运行此程序的目录中查找,您可能会看到您在纯Tcl中创建了一个名称奇怪的文件,即|之前。:
package require fileutil
set lines {}
::fileutil::foreachLine line inputfile {
if {![regexp #|> $line]} {
lappend lines $line
}
}
set lines [lsort -decreasing -integer -index 6 $lines]
set lines [lrange $lines 0 9]
puts [join $lines \n]\n
-double可能比-integer更合适
编辑:在为lsort编写基于0的索引选项时,我错误地将基于1的-k索引转换为命令排序。现在已经纠正了
文档:纯Tcl中的包、、、:
package require fileutil
set lines {}
::fileutil::foreachLine line inputfile {
if {![regexp #|> $line]} {
lappend lines $line
}
}
set lines [lsort -decreasing -integer -index 6 $lines]
set lines [lrange $lines 0 9]
puts [join $lines \n]\n
-double可能比-integer更合适
编辑:在为lsort编写基于0的索引选项时,我错误地将基于1的-k索引转换为命令排序。现在已经纠正了
文档:package,,,,,问题在于,当exec单独看到一个>或在一个单词的开头看到一个表示重定向的>时,它会执行“特殊的操作”。不幸的是,没有实际的方法可以直接避免这种情况;这是一个Tcl语法系统没有帮助的领域。你最终不得不做这样的事情:
exec grep -v "#" inputfile | sh -c {exec grep -v ">"} | sort -r -nk7 | head
您还可以将整个管道移动到Unix shell端:
exec sh -c {grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head}
尽管坦率地说,这是可以在纯Tcl中实现的,这将使它也可以移植到Windows上…问题是,当exec自己看到>或在单词开头看到>时,它会做“特殊的事情”,因为这表示重定向。不幸的是,没有实际的方法可以直接避免这种情况;这是一个Tcl语法系统没有帮助的领域。你最终不得不做这样的事情:
exec grep -v "#" inputfile | sh -c {exec grep -v ">"} | sort -r -nk7 | head
您还可以将整个管道移动到Unix shell端:
exec sh -c {grep -v "#" inputfile | grep -v ">" | sort -r -nk7 | head}
尽管坦率地说,这是你可以在纯Tcl中做的事情,这将使它也可以移植到Windows上…@Etan Reissne我尝试过,例如:>exec{grep-v cg_metrics.rpt | grep-v>}但是我得到了:错误:无法执行grep-v cg_metrics.rpt | grep-v>:没有这样的文件或目录ThanksIt仍然给出错误:>exec{bash-c'grep-vcg_metrics.rpt | grep-v>'}错误:无法执行bash-c'grep-vcg_metrics.rpt | grep-v>':没有此类文件或directory@EtanReissne我试过,例如:>exec{grep-vcg_metrics.rpt | grep-v>}但是我得到了:错误:无法执行grep-vcg_metrics.rpt | grep-v>:没有这样的文件或目录ThanksIt仍然给出错误:>exec{bash-c'grep-vcg_metrics.rpt | grep-v>}错误:无法执行bash-c'grep-v cg_metrics.rpt | grep-v>':没有这样的文件或目录这不会给出错误,但恐怕不起作用。它不会跳出包含´´或´的行。确实已按您所述创建了一个文件。谢谢您可能需要grep-E。它适用于我grep-E。您使用的是什么版本的greping?我使用的是版本8.5。这不会给出错误,但恐怕不起作用。它不会跳过包含´´或>”的行。确实,正如您所描述的那样创建了一个文件。谢谢您可能需要grep-E。它对我来说适用于grep-E。您使用的是什么版本的grep?我使用的是版本8.5