‘вычитание’ из одного файла другого
Поздним зимним вечером передо мной снова встала проблема с файликами типа login:pass, на этот раз нужно было вычесть из одного второй, иначе говоря получить такой файл, где содержались бы только те записи первого файле, которых нет во втором. Небоюсь злобы гуру различных оффисов, но такой функции явно нет ни в одном из приложений набора office. И я опять написал скриптик, и опять на Ruby.
А вот он:
#!/usr/bin/ruby
require ‘base64′n=ARGV.size
if n<=3 or n>5
puts “Not enought arguments\n <firstfile> <secondfile> <+|-> [outputfile] [-su<d|U>]”
exit
end
$fi_file=ARGV[0]
$se_file=ARGV[1]
$sign=ARGV[2]
if $sign!=’+’ and $sign!=’-’
puts “Unknow argument #{$sign}”
exit
enddef make (str)
sort=false
udcase=0
uniq=false
if str.include? ‘s’ then sort=true end
if str.include? ‘d’ then udcase=1 else
if str.include? ‘U’ then udcase=2 else udcase=0 end
end
if str.include? ‘u’ then uniq=true end
return sort,udcase,uniq
endif n>3
if !(ARGV[3].include?(‘-s’) or ARGV[3].include?(‘-d’) or ARGV[3].include?(‘-U’) or ARGV[3].include?(‘-u’))
$outfile=ARGV[3]
else
$outfile=$fi_file+$se_file+’_out’
$sort,$udcase,$uniq=make ARGV[3]
endif n==5 then $sort,$udcase,$uniq=make ARGV[4] end
end
begin
f_arr=IO.readlines($fi_file)
rescue => e
puts “Can’t read file #{$fi_file}:#{e}”
endbegin
s_arr=IO.readlines($se_file)
rescue => e
puts “Can’t read file #{$se_file}:#{e}”
endf_arr.each {|x| x.chop!}
s_arr.each {|x| x.chop!}case $sign
when ‘-’
r_arr=f_arr-s_arr
when ‘+’
r_arr=f_arr+s_arr
endif $udcase==1
puts “Downcase…”
r_arr.each {|x| x.downcase!}
end
if $udcase==2
puts “Upcase…”
r_arr.each {|x| x.upcase!}
end
if $uniq
puts “Delete repetitions…”
r_arr.uniq!
end
if $sort
puts “Sort…”
r_arr.sort!
endbegin
puts “Create output file #{$outfile}”
File.open($outfile,”w”) {|file| r_arr.each {|x| file.puts x }}
rescue => e
puts “Can’t create file #{$outfile}:#{e}”
end
На входе:
- firstfile – первый файл
- secondfile – второй файл
- +/- – соответсвенно либо прибавляем к первому второй, либо вычитаем из первого второй
- outputfile – выходной файл
- ключ -s – сортировка
- ключ -u – убрать повторы
- ключ -d – нижний регистр
- ключ -U – верхний регистр
Наслаждйтесь.
grep -xFvf 1 2
Так непроще?
ну ясен болт, но я же пишу нет под баш.
Хотя я должен признать, что я даже об этом не задумывался.
P.S. Я очень рад консруктивной критики, если и не читатель что-то добудет полезное, то я