忽略文件TCL中的行

忽略文件TCL中的行,tcl,Tcl,假设我有一个file1,里面有一些查询 Query 1 Query 2 Query 3 我有一个普通的文本文件2,其中包含一堆数据 Data 1 Query 1 something something Data something Query 2 something something Something Query 3 something something Data1 continue no query Data2 continue no query 如何创建循环,使其忽略包含来自fil

假设我有一个file1,里面有一些查询

Query 1
Query 2
Query 3
我有一个普通的文本文件2,其中包含一堆数据

Data 1 Query 1 something something
Data something Query 2 something something
Something Query 3 something something
Data1 continue no query
Data2 continue no query
如何创建循环,使其忽略包含来自file1的查询的行,而只打印文件中没有查询的行?所以在这种情况下,只打印这些值

Data1 continue no query
Data2 continue no query
我尝试使用我制作的循环脚本生成结果

将要忽略的查询从文件1存储到$wlistItems中

set openFile1 [open file1.txt r]
while {[gets openFile1 data] > -1} {
set wlist $data
append wlistItems "{$wlist}\n"
}
close $openFile1
set openFile2 [open file2.txt r]
while {[gets $openFile2 data] > -1} {
for {set n 0} {$n < [llength $wListItems]} {incr n} {
if {[regexp -all "[lindex $wListItems $n]" $data all value]} {
continue
}
puts $data
}
}
close $openFile2
处理文件2以打印行而不忽略查询

set openFile1 [open file1.txt r]
while {[gets openFile1 data] > -1} {
set wlist $data
append wlistItems "{$wlist}\n"
}
close $openFile1
set openFile2 [open file2.txt r]
while {[gets $openFile2 data] > -1} {
for {set n 0} {$n < [llength $wListItems]} {incr n} {
if {[regexp -all "[lindex $wListItems $n]" $data all value]} {
continue
}
puts $data
}
}
close $openFile2
set openFile2[open file2.txt r]
而{[gets$openFile2 data]>-1}{
对于{set n0}{$n<[llength$wListItems]}{incr n}{
如果{[regexp-all”[lindex$wListItems$n]“$data-all-value]}{
持续
}
放入$data
}
}
关闭$openFile2
但是,脚本不会跳过这些行。而是从文件2中打印出重复的数据

而{[gets$openFile2 data]>-1}{
while {[gets $openFile2 data] > -1} {
    set found 0
    for {set n 0} {$n < [llength $wListItems]} {incr n} {
        if {[regexp -all "[lindex $wListItems $n]" $data all value]} {
            set found 1
            break
        }
    }
    if {!$found} {
        puts $data
     }
}
集找到0 对于{set n0}{$n<[llength$wListItems]}{incr n}{ 如果{[regexp-all”[lindex$wListItems$n]“$data-all-value]}{ 集找到1 打破 } } 如果{!$found}{ 放入$data } }
更简单的解决方案:

package require fileutil

set queries [join [split [string trim [::fileutil::cat file1]] \n] |]
::fileutil::foreachLine line file2 {
    if {![regexp ($queries) $line]} {
        puts $line
    }
}
第一个命令(在
包require
之后)读取带有查询的文件,并将其打包为一组分支(
query1 | query2 | query3
)。第二个命令逐行处理第二个文件,并打印不包含任何这些分支的行

文档:包、、、

我只想这样做:

puts [exec grep -Fvf file1 file2]

嗨,迪内什,你的解决方案非常有效。非常感谢!