tcl对文件进行排序

tcl对文件进行排序,tcl,Tcl,我有一个目录,其中有多个名为*MIS的文件。现在这些文件包含重复的行。 我需要读取名为VIA having name*\u MIS的目录中的所有文件,并在删除重复行后更新文件(需要执行sort-u)。需要使用TCL时,您可以尝试以下方法 set dir_path path_to_directory_contains_MIS_files set files_list [glob -directory $dir_path *_MIS] foreach mis_file $files_list {

我有一个目录,其中有多个名为*MIS的文件。现在这些文件包含重复的行。
我需要读取名为VIA having name*\u MIS的目录中的所有文件,并在删除重复行后更新文件(需要执行sort-u)。需要使用TCL时,您可以尝试以下方法

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"
    } 
}

你可以试试下面的方法

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"
    } 
}

如果在纯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
}

解决方案的关键部分:和/

如果在纯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
}

解决方案的关键部分:和/

注意,罗曼的答案中的一般模式是相同的;迭代匹配的文件名,对每个文件名进行排序/取消限定。唯一显著的区别是,他使用一个外部程序来完成任务的内部部分。将
-nonewline
read
一起使用,否则在最后会得到一个虚假的空列表元素。请注意,Roman的答案中的一般模式是相同的;迭代匹配的文件名,对每个文件名进行排序/取消限定。唯一显著的区别是他使用一个外部程序来完成任务的内部部分。将
-nonewline
read
一起使用,否则最后会得到一个虚假的空列表元素。