Van egy szövegfájlom, amiben szeretnék kiküszöbölni bizonyos sorokat,
mégpedig azokat, amelyek ugyanolyan hosszúak, mint a rákövetkező sor,
és ha összehasonlítjuk a karaktereket, akkor a megegyező karakterek éppen az első sort adják.
A meg nem egyező karakterek helyett pedig képzeljünk oda _-t.
Tehát pl. ebből szeretném nyerni a lentebbi fájlt:
07130 | 01286:DGWN;01730:DAWI;70267:DGWN;
07130 | 01286:DGWN;01730:DAWI;70267:DGWN;70375:DGWN;
90107(VMI) | 23000:____;13021:____;
90107(VMI) | 23000:EZA_;13021:DGW1;
VALAMI | AKARMI
VALAMA | AKARMI
07130 | 01286:DGWN;01730:DAWI;70267:DGWN;
07130 | 01286:DGWN;01730:DAWI;70267:DGWN;70375:DGWN;
90107(VMI) | 23000:EZA_;13021:DGW1;
VALAMI | AKARMI
VALAMA | AKARMI
PHP szkripttel meg tudom oldani, de valami elegánsabbra vágyom.
- 1149 megtekintés
Hozzászólások
cat ./fileod | sort -u >./kimenetifileod
- A hozzászóláshoz be kell jelentkezni
Sajnos ez visszaadja az eredeti fájlt.
- A hozzászóláshoz be kell jelentkezni
Akkor nincs az eredetiben duplikátum.
- A hozzászóláshoz be kell jelentkezni
Nem is a duplikált sorokat szeretném elhagyni. Hanem:
"ha összehasonlítjuk a karaktereket, akkor a megegyező karakterek éppen az első sort adják."
pl. ezekből az elsőt:
90107(VMI) | 23000:____;13021:____;
90107(VMI) | 23000:EZA_;13021:DGW1;
Valóban nem fogalmaztam pontosan: a meg nem egyező karakterek helyett meg képzeljünk oda _-t.
- A hozzászóláshoz be kell jelentkezni
Ja, akkor nem úszod meg, hogy programot írj.
- A hozzászóláshoz be kell jelentkezni
Ha spec sorokban a ____ részt akarod keresni és ezeket eltüntetni akkor egyszerű dolgod van:
grep -v ____ fajlom > ujfajl
De ha soronként akarod az összehasonlítást akkor ez nem járható.
A fentebbi kiegészítésed után a _ akkor a nem egyező karaktereket adja?
--
falura elmegy, városban meg úgy sem nézik...
- A hozzászóláshoz be kell jelentkezni
Köszi, de sajnos csak akkor engedhetek el egy sort, ha van "gazdagabb" rákövetkezője.
- A hozzászóláshoz be kell jelentkezni
awk '{if(length(pre)!=length($0) || valami ){print $0;pre=$0;}'
'valami': a karakterenkénti illesztés kb: a 'pre' sorban a spéci karaktereket escapeed, a joker karaktered helyett pontot írsz, és ha erre a 'modpre'-re illeszkedik $0, akkor tér vissza igennel
- A hozzászóláshoz be kell jelentkezni
Köszi! Még ez a legkellemesebb megoldás. :-) Lehet ilyet helyből, hogy pre?! Guszta!!
Végül aztán a leggyorsabbnak az tűnt, hogy kínzom egy kicsit a PHP értelmezőt...
$f=file('fajlom');
$fsize=sizeof($f)-1;
for($i = 0; $i < $fsize; $i++) {
if (trim($f[$i])=='') continue;
if (strlen($f[$i])!=strlen($f[$i+1])) {print $f[$i]; continue;}
$f1=trim($f[$i]); $f2=trim($f[$i+1]); $l=strlen($f1);
$c=str_split($f1); $d=str_split($f2);
$omit=true;
for ($j=0; $j<$l; $j++) {
if (($c[$j]!='_')&&($c[$j]!=$d[$j])) {$omit=false; $j=$l; }
}
if (!$omit) print $f1."\n";
}
print $f2."\n";
- A hozzászóláshoz be kell jelentkezni
Persze, helyből definiálta a 'pre'-t. ;)
- A hozzászóláshoz be kell jelentkezni
Ja, most fogtam föl, hogy ott a sor végén már a következő sor számára definiálta.
Csak akkor megtévesztő a név, mert nem előreolvasást (pre-read), hanem az előző sor tartalmát jelenti.
- A hozzászóláshoz be kell jelentkezni