lal*_*lli 117 bash scripting sh
我有一个文件f1:
line1
line2
line3
line4
..
..
Run Code Online (Sandbox Code Playgroud)
我想删除另一个文件中的所有行f2:
line2
line8
..
..
Run Code Online (Sandbox Code Playgroud)
我想的东西cat和sed,这甚至还没有接近我所预期的.我怎样才能做到这一点?
gab*_*uzo 141
grep -v -x -f f2 f1 应该做的伎俩.
说明:
-v 选择不匹配的行-x 仅匹配整行-f f2 从中获取模式 f2人们可以改用grep -F匹配固定的字符串从fgrep,而不是模式(如果你想删除一个"你所看到的,如果你得到了什么"的方式行,而不是治疗的线条f2为正则表达式模式).
Ign*_*ams 54
改为尝试comm(假设f1和f2已经"已经排序")
comm -2 -3 f1 f2
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 13
对于不太大的排除文件,可以使用AWK的关联数组.
awk 'NR == FNR { list[tolower($0)]=1; next } { if (! list[tolower($0)]) print }' exclude-these.txt from-this.txt
Run Code Online (Sandbox Code Playgroud)
输出的顺序与"from-this.txt"文件的顺序相同.tolower()如果需要,该函数使其不区分大小写.
算法复杂度可能是O(n)(exclude-these.txt size)+ O(n)(from-this.txt size)
jcs*_*ica 10
类似于Dennis Williamson的回答(主要是语法更改,例如明确设置文件编号而不是NR == FNR技巧):
awk '{if (f==1) { r[$0] } else if (! ($0 in r)) { print $0 } } ' f=1 exclude-these.txt f=2 from-this.txt
访问r[$0]创建该行的条目,无需设置值.
假设awk使用具有常量查找和(平均)恒定更新时间的哈希表,其时间复杂度将为O(n + m),其中n和m是文件的长度.就我而言,n约为2500万,m~14000.awk解决方案比sort更快,我也更喜欢保持原始顺序.
如果您有Ruby(1.9+)
#!/usr/bin/env ruby
b=File.read("file2").split
open("file1").each do |x|
x.chomp!
puts x if !b.include?(x)
end
Run Code Online (Sandbox Code Playgroud)
具有O(N ^ 2)复杂度。如果您想关心性能,这是另一个版本
b=File.read("file2").split
a=File.read("file1").split
(a-b).each {|x| puts x}
Run Code Online (Sandbox Code Playgroud)
它使用散列来实现减法,复杂度O(n)(a的大小)+ O(n)(b的大小)
这是一个小基准,由user576875提供,但有10万行,以上:
$ for i in $(seq 1 100000); do echo "$i"; done|sort --random-sort > file1
$ for i in $(seq 1 2 100000); do echo "$i"; done|sort --random-sort > file2
$ time ruby test.rb > ruby.test
real 0m0.639s
user 0m0.554s
sys 0m0.021s
$time sort file1 file2|uniq -u > sort.test
real 0m2.311s
user 0m1.959s
sys 0m0.040s
$ diff <(sort -n ruby.test) <(sort -n sort.test)
$
Run Code Online (Sandbox Code Playgroud)
diff 用来显示生成的2个文件之间没有差异。
| 归档时间: |
|
| 查看次数: |
65587 次 |
| 最近记录: |