[megoldva] Spec. sorok eltüntetése szövegből

 ( szz | 2011. március 23., szerda - 9:34 )

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.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

cat ./fileod | sort -u >./kimenetifileod

Sajnos ez visszaadja az eredeti fájlt.

Akkor nincs az eredetiben duplikátum.

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.

Ja, akkor nem úszod meg, hogy programot írj.

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...

Köszi, de sajnos csak akkor engedhetek el egy sort, ha van "gazdagabb" rákövetkezője.

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

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";

Persze, helyből definiálta a 'pre'-t. ;)

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.