Portál AbcLinuxu, 24. prosince 2025 18:56
#!/usr/bin/env python
import sys,os
def getlines(filename):
lines = {}
for num, line in enumerate(file(filename)):
lines[line.rstrip()] = num + 1
return lines
def compare(linesx, linesy):
for line in linesx.keys():
if linesy.has_key(line):
continue
print linesx[line], line
lines1 = getlines(sys.argv[1])
lines2 = getlines(sys.argv[2])
compare(lines1, lines2)
print '-'*80
compare(lines2, lines1)
A když to otestuju třeba na těchto souborech
$ cat soubor1 prvni spolecny treti tohle neni v tom druhem druhy $ cat soubor2 prvni druhy treti spolecny a tohle zase neni v tom prvnimTak to vypíše
$./difflines.py soubor1 soubor2 4 tohle neni v tom druhem --------------------------------------------- 5 a tohle zase neni v tom prvnimUkazuje to i čísla řádků.
import sys a = file(sys.argv[1]).readlines() b = file(sys.argv[2]).readlines() sys.stdout.writelines([x for x in a if not x in b]) sys.stdout.writelines([x for x in b if not x in a])... ale to je jen taková hříčka.
a, b=ARGV[0..1].map{|x| File.open(x).readlines }
puts a-b; puts b-a
?
Zase úkol?

$ cat soubor1 soubor2 | sort | uniq --unique a tohle zase neni v tom prvnim tohle neni v tom druhem
uniq --unique, tak by toto bylo nejjednodušší řešení a bylo by to super, jen jsem to zkoušel takhle fláknout do linuxu a nic. (Takhle ne
soubor1 a soubor2 jsem nahradil názvem souborů, které existujou)

chorchoj:22:56:12 ~$ cat soubor1 prvni spolecny treti tohle neni v tom druhem druhy chorchoj:22:56:16 ~$ cat soubor2 prvni druhy treti spolecny a tohle zase neni v tom prvnim chorchoj:22:56:18 ~$ sort soubor1 soubor2 | uniq --unique a tohle zase neni v tom prvnim tohle neni v tom druhem
sed -n "/$searchstr/=" $i >out.s, kde $searchstr je vlastně regulární výraz a v $i je uložen název souboru dá se tedy nějak zjisti jestli něco našel a zapsal do souboru nebo to musím obejít nějak jinak. díky
man test
...
-s soubor
Pravda, když soubor existuje a má délku větší než nula.
...
Právě, že ty dva vstupy jsou pro bash problém (osobně bych užil třeba awk, ale zadání je zadání). Dalo by se to řešit (hodně násilně) nějakým "bufferem", kde v proměnných A1, A2, A3, A4, ... jsou řádky prvního souboru, v proměnných B1, B2, ... druhého souboru. Pak na to hodíš kdejaký algoritmus si zamaneš.
Lepší by bylo ty soubory spojit, třeba jak jsem naznačoval o sudých a lichých řádcích (jen je potřeba si promyslet, co s případem, kdy nemají stejně řádků). Ale asi na tuto strukturu opět nenapasuješ všechny algoritmy porovnání souborů.
Ad cokoli-specific: chtěl jsem naznačit, že například my ve škole na UNIXu povinně pracujeme na Solarisu<flame>, protože se jedná o mnohem stabilnější UNIX než GNU/Linux</flame>. Ale ten třeba nepodporuje mnoho rozšíření, které jsou typické pro GNU, tedy GNU-specific.
Ale pokud můžeš kromě diff používat cokoli... Co takhle comm? Ale to je jen další nápad, vracíme se k tomu, že zadání je dost nejednoznačné...
1. soubor 1 2 3 4 2. soubor 1 2 4 5 Smíchaný soubor (jestli to dobře chápu) 1 1 2 2 3 4 4 5Pokud ho budu porovnávat po dvojicích, tak bude, podle mne, vyhazovat nesmysli typu 3 není v pravo a 4 není vlevo a to samé pro 4 a 5 ne? Pak jsi něco psal o nějakém velice jednoduchém sedu, ale to nějak nechápu.
3c3 < 3 --- > 4 4c4 < 4 --- > 5Ohledně toho jednoduchého sedu -- tento prokládaný soubor nemusíš read-ovat po jednom řádku (pokud má hodně řádků, tak si kernel užije naplno fork() a exec()
). Protože navíc jeho struktura je dost jednoduchá a algoritmus ještě jednodušší, tak by se dal tento soubor jen prohnat sed skriptem a bylo by. Ale taky. Má to svá úskalí, třeba nevím, jak sed může zjistit, na kolikátém řádku se nachází apod. To by se třeba tedy do toho slitého souboru přidalo na začátek řádku nějaké info v pevném formátu (třeba první číslo na řádku by značilo první nebo druhý soubor, druhé číslo by značilo číslo řádku a pak právě jedna mezera a samotný řádek).
exec 3<soubor1
exec 4<soubor2
IFS=''
read -u 3 line1
read -u 4 line2
Napsat plně funkční diff nebude trivální. Začal bych tím, že bych nadefinoval zjednodušené zadání. Omezení by bylo takové, že je povolen maximální rozdíl 1 řádek v oblasti začínající a končící úplnou shodou.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.