2013-03-05 84 views
0

我有一个目录,其名称* MIS有多个文件。现在这些文件包含重复的行。 我需要读取名为VIA的目录中的所有文件,并删除重复的行(需要执行排序-u)后更新文件名* _MIS &。需要使用TCLtcl排序文件

回答

2

你可以尝试以下

set dir_path path_to_directory_contains_MIS_files 
set files_list [glob -directory $dir_path *_MIS] 
foreach mis_file $files_list { 
    if {[catch {exec sort -u $mis_file -o $mis_file} result]} { 
     puts "ERROR: $result" 
    } 
} 
3

如果你在纯Tcl的做这个,你应该拆分任务分为两个部分:排序文件(这将使一部分漂亮的程序),并且排序目录中的所有相关的文件的一部分:

proc sort_file {filename} { 
    # Read the file 
    set f [open $filename] 
    set data [read $f] 
    close $f 

    # Sort the lines, removing dupes 
    set lines [split $data "\n"] 
    set sorted_uniques [lsort -unique $lines] 
    set data [join $sorted_uniques "\n"] 

    # Write the file 
    set f [open $filename w] 
    puts $f $data 
    close $f 
} 

# Now process all the relevant files; the -directory option is a convenient way 
# to specify which directory to do the searching in. 
foreach filename [glob -directory VIA *_MIS] { 
    sort_file $filename 
} 

解决方案的关键部分:lsort -uniqueforeach/glob

+0

请注意,罗马的答案中的一般模式是相同的;迭代匹配的文件名,对每个文件进行排序/分解。唯一显着的区别是他在任务的内部使用外部程序。 – 2013-03-05 09:03:47

+0

使用带有'read'的'-nonewline'或者你会在最后得到一个虚假的空列表元素。 – potrzebie 2013-03-05 09:10:59