【发布时间】:2018-07-04 13:42:44
【问题描述】:
我尝试使用 TCL 将所有相似的 csv 文件组合在一起
exec /bin/cat checked_*.csv > check_all.csv
但结果显示:
/bin/cat: checked_*.csv: 没有这样的文件或目录
执行时
"exec /bin/cat check_*.csv > check_all.csv" (文件“test.tcl”第 80 行)
【问题讨论】:
我尝试使用 TCL 将所有相似的 csv 文件组合在一起
exec /bin/cat checked_*.csv > check_all.csv
但结果显示:
/bin/cat: checked_*.csv: 没有这样的文件或目录
执行时
"exec /bin/cat check_*.csv > check_all.csv" (文件“test.tcl”第 80 行)
【问题讨论】:
exec 命令不像 shell 那样扩展文件名,所以cat 只接收字符串checked_*.csv。我的猜测是
exec /bin/cat {*}[glob checked_*.csv] > check_all.csv
会更好(不过我在 Windows 上)。由于扩展,需要 Tcl 8.5 或更高版本。
我会推荐
package require fileutil
::fileutil::writeFile check_all.csv [::fileutil::cat {*}[glob -nocomplain checked_*.csv]]
顺便说一句。
【讨论】:
/bin/cat checked_*.csv > check_all.csv会得到什么?
check_all.csv?
嗯,也许是纯 Tcl 解决方案?
set files [glob checked_*.csv]
set fout [open "check_all.csv" w]
foreach file $files {
set fin [open $file r]
fcopy $fin $fout
close $fin
}
close $fout
编辑:感谢 glenn jackman,将 puts $fout [read $fin] 替换为 fcopy $fin $fout。
【讨论】:
fcopy $fin $fout而不是puts $fout [read $fin]——我相信fcopy会更有效率。
你需要 exec 和你的 *.csv 的完整路径,比如
exec /bin/cat /home/s/pathtofile/checked_*.csv > check_all.csv
【讨论】:
exec 不会为您扩展 glob。
快速而肮脏的解决方案:启动一个外壳来为您处理通配和重定向:
exec /bin/sh -c {/bin/cat checked_*.csv > check_all.csv}
【讨论】: