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
- A hozzászóláshoz be kell jelentkezni
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
ó
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
[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)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
[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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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) ?
- A hozzászóláshoz be kell jelentkezni
Na, megirtam:
Elso gepen:
dpkg -l | sort -k 2f > regi_file.txt
Masodik gepen:
dpkg -l | sort -k 2f > uj_file.txt
while read
do
echo $REPLY >> tessek
grep $REPLY /uj_file.txt >> tessek
done < /regi_file.txt
sort /tessek | uniq -u > hianyzo_csomagok
- A hozzászóláshoz be kell jelentkezni
apt-get install moreutils
ssh host1 dpkg --get-selections > dpkg.out.1
ssh host2 dpkg --get-selections > dpkg.out.2
combine dpkg.out.1 not dpkg.out.2 # ami fent van a host1-en, de nincs a host2-on
- A hozzászóláshoz be kell jelentkezni
Ezt markolom book.
- A hozzászóláshoz be kell jelentkezni
én is
- A hozzászóláshoz be kell jelentkezni
Koszi. Azota mar migralgatok, nem volt idom ide felnezni, de maskor meg jol jon :)
- A hozzászóláshoz be kell jelentkezni
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'
- A hozzászóláshoz be kell jelentkezni
Uff :) Micsoda parancsokat tanulok itt :)
(Multkor a join meg a paste, most meg ezek. Jo lenne valami osszefoglalo a "nem-annyira-ismert-Linux-parancsokrol"
- A hozzászóláshoz be kell jelentkezni
Az én man-om (meg az emlékeim is) azt mondják, hogy a comm-mal összegyűjtött adatoknak rendezve kell lenniük, szóval hosszútávon érdemes hozzátenni a cut után még egy sort -ot is. (Kivéve, ha a dpkg eleve abban adja.)
- A hozzászóláshoz be kell jelentkezni
Meg valami: a dpkg -l eredmenyebol csak a csomag neve erdekel:
awk '{print $2}'
Az elso ot sor kuka (fejlec):
sed '5ld' (Ezt eppen tegnap talaltam)
Szoval javitva:
dpkg -l | sed '5ld' |awk '{print $2}' |sort > uj_file.txt
- A hozzászóláshoz be kell jelentkezni
Akkor inkább:
dpkg -l | awk 'NR>5 {print $2}' |sort > uj_file.txt
- A hozzászóláshoz be kell jelentkezni
ja, hat az a sed nem jo.
sed '1,5 d' volt asszem a helyes. Vagy ilyesmi. Probalgattam, ugy jot tki, melyik torli az 5. sort, melyik az 1-5-is sit.
- A hozzászóláshoz be kell jelentkezni
Meg jelen esetben fölösleges is, hiszen az awk önmagában is tökéletesen megoldja a dolgot.
- A hozzászóláshoz be kell jelentkezni
Azért ne hanyagoljuk el azt a sed -et:
sed '1,5d' - erre egy kevésbé elterjedt megoldás:
sed -n '6,$p'
(Amúgy pont az járt az agyamban, hogy a combine helyett van valami ami standardabb eszköz, és lám, meg is jelent a comm :-)
- A hozzászóláshoz be kell jelentkezni