[megoldva] Hosszú fájl adott sorszámú sora

Arra keresek módszert, hogy hogyan lehet kinyerni egy igen nagy txt fájl adott sorszámú sorát bash-ben vagy perlben. Ne tail-head megoldást írjatok. Nehezítés: egy fájl adott sorszámú sora utáni első olyan sor kellene,ahol egy adott pozíciójú - pl 8. - karakter eltér az előző sor ugyanilyen pozíciójú karakterétől.

===
Egy jó megoldás, amiben a feladat célja (egy alkalmas split) is látható:

f=valamifilenev.txt
sorkellene=$(awk -F "" -v sor=4000000 'NR == sor { ezaz = $8 } (NR > sor) && (ezaz != $8) { printf "%d", NR-1; exit;}' $f)
split -d -l $sorkellene $f "tmpf_"

Hozzászólások

awk-van talán így lehet:

aron@deb-aron:/tmp$ time cat a.txt | awk 'NR==98657{print $0}'
Ittkezdodik a 98657. sor. Ez meg mar a vege.

real    0m0.032s
user    0m0.036s
sys     0m0.000s

Mekkora file-od van?


BEGIN { FS="" }

NR == 13 { ezaz = $8 }

(NR > 13) && (ezaz != $8) {
        printf "bakfitty a(z) %d. sorban\n", NR;
}

-----
"Én vagyok a hülye, hogy leállok magával vitatkozni."

Ha jól értem a nehezítést:

perl -ne 'BEGIN{$s=12345;$p=8}if($.>$s){$c=substr $_,$p,1;if($c ne $d){print;exit}$c2=$c}' nagy_file.txt

Az elején a $s= után helyettesítsd be, hogy hányadik sortól kezdje, $p= után pedig, hogy hányadik karaktert nézze a sorban.

Talán:


my ( $c1, $c2 );
while (<STDIN>) {
    next if $line > $.;
    $c2 = substr $_, $offset, 1;
    if ( $line == $. ) {
        $c1 = $c2;
        next;
    }
    if ( $c1 ne $c2 ) {
        print;
        last;
    }
}

Végül ilyen lett a megoldás (egy splithez kellett a megfelelő sor megkeresése); köszönet érte!
A dolog háttere az, hogy egy feldolgozó program csak 4-5000000 sornyi bemeneti visel el, de a nagy bemeneti fájl (8 számjegyű) azonosítói csak időnként változnak, és csak úgy lesz jó a feldolgozás, ha ugyanabban a fájlban maradnak az ugyanolyan azonosítójú sorok. Ez így megoldódott!

f=valamifilenev.txt
sorkellene=$(awk 'BEGIN { FS="" } NR == 4000000 { ezaz = $8 } (NR > 4000000) && (ezaz != $8) { printf "%d", NR-1; exit;}' $f)
split -d -l $sorkellene $f "tmpf_"