我想在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 ">" 我得到:
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脚本中执行初始管道命令?
谢谢
发布于 2016-04-19 10:06:49
问题是,当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中完成的事情,这将使它也可以移植到…上。
发布于 2016-04-18 14:54:37
>在这里造成了问题。
您需要从tcl、和( shell )中转义它,以使它在这里工作。
exec grep -v "#" inputfile | grep -v {\\>} | sort -r -nk7 | head或者(这更好,因为你少了一个grep)
exec grep -Ev {#|>} inputfile | sort -r -nk7 | head 如果您查看运行此目录的目录(假设为tclsh或类似的目录),您可能会看到以前创建了一个命名奇怪的文件(即|)。
发布于 2016-04-18 16:28:08
纯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更合适)
编辑:i在为lsort编写(0) -index选项时误译了命令sort的(1)-index索引。现在,它已得到纠正。
文档:丝状醇包、如果、加入、拉皮、艾兰治、艾索德、套餐、看跌期权、雷杰普、设置
https://stackoverflow.com/questions/36695424
复制相似问题