假设我有一个文件1里面有几个查询,
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
我尝试使用我制作的循环脚本生成结果
将要从file1忽略的查询存储到$ wlistItems
set openFile1 [open file1.txt r]
while {[gets openFile1 data] > -1} {
set wlist $data
append wlistItems "{$wlist}\n"
}
close $openFile1
处理file2以打印行而不会忽略查询
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
但是,脚本不会跳过这些行。它反而打印出来自file2的重复数据。
答案 0 :(得分:2)
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
}
}
答案 1 :(得分:1)
更简单的解决方案:
package require fileutil
set queries [join [split [string trim [::fileutil::cat file1]] \n] |]
::fileutil::foreachLine line file2 {
if {![regexp ($queries) $line]} {
puts $line
}
}
第一个命令(在package require
之后)用查询读取文件并将它们打包为一组分支(Query 1|Query 2|Query 3
)。第二个命令逐行处理第二个文件,并打印那些不包含任何分支的行。
文档:fileutil包,if,join,package,puts,Syntax of Tcl regular expressions,regexp,{{ 3}},set,split
答案 2 :(得分:1)
我只是这样做:
puts [exec grep -Fvf file1 file2]