Milyen megoldást lehetne kiatálni, a következő problémára:
Van egy kb. 100 ezer soros text file:
1:
alma
körte
barack
2:
szilva
narancs
narancs
3:
banán
egres
egres
egres
...
...
Azokat a sorokat szeretném kicserélni, ahol több van belőlük, és azt szeretném, hogy csak 1 maradjon.
Fontos a szöveget nem rendezhetem, a sorrendnek maradnia kell.
alap esetben minden szó csak egyszer fordulhat elő, kivéve az említett esetekben.
Hozzászólások
Az ismétlések csak egymás után lehetnek, vagy elszórva is?
PL. lehet ilyen:
körte
alma
banán
körte
?
Ha igen, akkor melyik helyen akarod bent hagyni a körtét? Az első előfordulási helyen? Vagy?
Csaba
Csak egymás után lehetnek az ismétlések.
amit mondtál, hogy:
körte
alma
banán
körte
ilyen előfordulás nincs.
egyszóval redukált sorozatot kell előállítanod? nem hangzik bonyolult feladatnak...
n = a sorok száma
ciklus i = 2-től n-ig { ha i. sor és i-1. sor azonos, akkor i. sort törlöd }
a törlést sokféleképpen meg tudod csinálni, például az új fájlba rögtön írhatod a feltételnek eleget nem tevő [nem törlendő] sorokat, vagy csak az indexeiket tárolod külön tömbbe, és a végén írod vissza fájlba [vagy ahova kell]
ez kellett?
:: by BRI.
:: config :: Acer TravelMate // Ubuntu Intrepid
:: tothab [a] gmail [pötty] kom
:: black rose immortal's weblog
Valami ilyesmi:
Csaba
tőled is hadd kérdem meg, oké hogy nem kell mindenre a legegyszerűbb megoldás, hogy tanulna úgy az ember, de azért ennyire a mély vízbe dobni valakit...
"uniq be.txt >ki.txt" erre a feladatra miért nem jó?
Nyilván igazad van.
Csaba
gondolom azért, mert az algoritmus lehetett a feladat... különben miért lenne kikötve, hogy az ismétlődés csak egymás utáni elemek esetében lehetséges?
:: by BRI.
:: config :: Acer TravelMate // Ubuntu Intrepid
:: tothab [a] gmail [pötty] kom
:: black rose immortal's weblog
"Van egy kb. 100 ezer soros text file:"
inkább egy konkrét feladat, nem gyakorlás, ahol a uniq sebessége nem lehet elhanyagolható már :)
akkor viszont erősen túlspecifikált a feladat :)
:: by BRI.
:: config :: Acer TravelMate // Ubuntu Intrepid
:: tothab [a] gmail [pötty] kom
:: black rose immortal's weblog
vagy alulkompetentált, és a lehető legjobbat tette, amit tudott, elmondta :)
ok, you're right
:: by BRI.
:: config :: Acer TravelMate // Ubuntu Intrepid
:: tothab [a] gmail [pötty] kom
:: black rose immortal's weblog
Ha az ismétlődések egymás után vannak biztosan, nem elszórva, akkor szerintem a ,,uniq'' parancsnak nézz utána.
G.
============================================
"Share what you know. Learn what you don't."
+1 uniq
Még csak paraméterezni sem kell, ez az alapértelmezett működése.
+1 uniq. Minek más?
Azért még egy excel makrót meg kéne várni :)
--
"Dude, you can't take something off the Internet.. that's like trying to take pee out of a swimming pool."
Ha nem ertettem felre a feladatot, akkor itt egy awk:
Kicsit attordelte, de azert hasznalhato.
Udv:
Istvan
#!/usr/bin/awk -f
{
/* Blokk eleje tartalmaz ":" -ot */
if( index($0,":") != 0 ) {
print $0
getline
i=1;
/* Blokk vegeig olvas, uressorig*/
while ( NF > 0 )
{
gyumolcs=$1
mar_van=0
for(j=1;j < i;j++)
{
if( gyumi[j] == gyumolcs ){
mar_van=1
}
}
if( ! mar_van ){
printf "%s \n",gyumolcs
gyumi[i]=gyumolcs
}
getline
i++
}
/* Blokk vegere ujsor */
print
}
}
ez most komoly? oké hogy valaki nem ismeri a uniq-ot, de ha valaki ilyen awk programot tud írni az miért nem?
:)
"Ha nem ertettem felre a feladatot,..."
De !
..mert nem tudok olvasni :-(
Az iras meg megy :-)
# remove duplicate, consecutive lines (emulates "uniq")
awk 'a !~ $0; {a=$0}'
# remove duplicate, nonconsecutive lines
awk '! a[$0]++' # most concise script
awk '!($0 in a) {a[$0];print}' # most efficient script
t
ui: http://lmgtfy.com/?q=awk+duplicate+lines