bash összehasonlítás

bash összehasonlítás

Hozzászólások

Hali gabcsi!

Ha elkap a gépszíj, el sem tudod engedni majd... :wink:

Meglátod nagyon ütős a perl...

Zsiráf

Szeretném ha valaki megoldaná ezt a feladatot:

Írjon Unix parancsfájlt, ami a paraméterként kapott fájlt úgy írja a standard outputra, hogy annak az n. oszlopából lesz az output n. sora. (n=1,2,...)

Az input sorai nem feltétlen azonos hosszúságúak. Ennek megfelel?en az output soraiban a jelek "összecsúszhatnak". Vagyis az outputból nem feltétlenül állítható vissza az input.

Ha pl. az input az alábbi 3 (sor elején kezd?d?) sor:
alma
dió
mogyoró

akkor az output:
adm
lio
móg
ay
o
r
ó

Hali!

Egy szkripttel szeretném megoldani a következő problémát:
Van két db file a.txt és b.txt (szöveges), Azokat a sorokat kellene kiszedni belőlük amelyek nem egyeznek, vagyis

- azokat a a.txt-ben lévő sorokat, melyek nincsenek meg b.txt-ben és fordítva.

Én a diff -urw a.txt b.txt -vel próbáltam de nem jó, azt mondja, hogy a '-'-al jelőltek nincsenek meg b.txt-ben ! Ez így nem igyaz!
A két file kb.: 10MB darabonként és full szöveges! (Ja az sdiff oszlopokat csinál, és nekem egy másik file-ba kellene beletenni soronként!)

Valaki vezessen rá légyzi!

köszi!
gabcsi

Hali!

No vardjal csak gabcsi:

a.txt:>
alma
korte
szilv 12 a
nyul

b.txt:>
alma
nyul
szilva
korte

A diff szerint a ket file teljesen kulonbozo, azaz pl az a.txt-rol ugy tersz at a b.txt-re, hogy kivonod az osszes sort (- a diffben), majd bepakolod a b.txt osszes sorat (+) a diffben. Te gondolom arra erositenel, hogy a pelda ket file kozott osszvissz a szilva, szilv 12 a legyen a kulombseg, nemde?
Node ez nem egycerru textprocessing am!! merthogy indexelni kene a dolgot. Legegyszerubb: sort a.txt >a.txt.sort, es sort b.txt >b.txt.sort

Ha ez megvan, akkor johet az az osszehasonlitas, de en inkabb valami hasonlo perl szkriptecsket hasznalnak:
[code:1:1fd0f7d30a]open IN1, "<a.txt.sort";
open IN2, "<b.txt.sort";
while (<IN1>)
{
$xa = <IN1>;
$xb = <IN2>;
next if ($xa eq $b); #ok egyformak!!!
while ($xa gt $xb)
{
print $xb;
$xb = <IN2>;
last if ($xa eq $xb); #no itt utolertuk
}
while ($xa lt $xb)
{
print $xa;
$xa = <IN1>;
last if ($xa eq $xb); #no itt utolertuk
}
}
[/code:1:1fd0f7d30a]

Zsiraf

U.i.: azert a bash nem erre valo... :P

[code:1:c502c24c54]sort a.txt|uniq >a.tmp; sort b.txt|uniq >b.tmp; cat a.tmp b.tmp|sort|uniq -u; rm a.tmp b.tmp[/code:1:c502c24c54]

ha tudod, hogy nincs 2 azonos sor egy fileon belul:[code:1:c502c24c54]cat a.txt b.txt | sort | uniq -u[/code:1:c502c24c54]
(igy nincs szukseg atmeneti tarolasra sem)

Hali zsiráf !

Hogyan is működik ez a perl ?
Mit kellene feltenni hozzá, hogyan nézzen ki a file formátuma és hogyan futtalsam?
Amint látod elég GYP vagyok perl-ből, de ki akarom próbálni amit írtál!

gabcsi.

[quote:991eda0a6c="gabcsi"]
Hogyan is működik ez a perl ?
Mit kellene feltenni hozzá, hogyan nézzen ki a file formátuma és hogyan futtalsam?

Altalaban minden komolyabb Linux disztribucio tartalmazza a Perl-t.

Debian:

apt-get install perl

(ha kell mas is akkor apt-cache search perl | less)

Utana letrehozol egy file-t:

touch elso

vi elso

beleirod:
#!/usr/bin/perl

[ide jon a perl kod]

chmod 755 valami

./valami

Ez az egyik lehetoseg. A masik, hogy leforditod a perl forraskodot a perlcc nevu dologgal.

Ekkor ugyanugy irsz egy perl scriptet. Majd

perlcc valami

Ezutan kapsz egy futtathato binarist.

Barataid:

man perl (teljes referencia)

Amivel erdemes kezdeni:

man

perl Perl overview (this section)
perlfaq Perl frequently asked questions
perltoc Perl documentation table of contents
perlbook Perl book information

Köszi !

Be-man-oltam magam a perl-be!

Köszi a fordításról nem esett benne még szó v. nem jutottam odáig!
Nem is olyan bonyolult és a szintaktikája is érthető, logikus!

Asszem foglalkozok vele egy kicsit amíg időm van!

gabcsi.

No, ez jol jon most :) (alig hat ev utan :) Szoval a diff paranccsal nincs erre lehetoseg (mitn a patch eseten, ahol megadhato, hogy +/- n sort nezzen)

Ket "dpkg -l | sort -k 2f" kimenet osszehasonlitasa lenne, hogy ne kelljen az osszes hianyzo csomagot kezzel osszevadasznom :)

UPDATE: Ez a fenti perl script nem jott ossze :( Van esetleg valakinek otlete, hogyan hasonlitsak ossze ket szovegfilet, ahol mondjuk az egyik fileban az 5. sorban van a szoveg, masik fileban ugyanez a szoveg a 7. sorban (es a diff ezert kulonbozonek veszi) ?

Nincs mit. Azota eszembe jutott egy masik megoldas is:


ssh host1 dpkg --get-selections | cut -f1 > dpkg.out.host1
ssh host2 dpkg --get-selections | cut -f1 > dpkg.out.host2

# 1. oszlop: host1, 2. oszlop: host2, 3. oszlop: mindketto
comm dpkg.out.host[12]

# vagy egy kicsit formazgatva, hogy jobban olvashato legyen
echo -e "host1\t\t\t\thost2\t\t\t\tboth" ; comm dpkg.out.host[12] | sed -e 's/\t/\t\t\t\t/g'