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_"
- 1344 megtekintés
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?
- A hozzászóláshoz be kell jelentkezni
Kb. 300 MB-os. Köszi!
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
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."
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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;
}
}
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindenkinek! Hamarosan kipróbálom a javaslatokat.
- A hozzászóláshoz be kell jelentkezni
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_"
- A hozzászóláshoz be kell jelentkezni
Így talán egy kicsit szebb lesz:
...awk -F "" 'NR == ...
-----
"Én vagyok a hülye, hogy leállok magával vitatkozni."
- A hozzászóláshoz be kell jelentkezni
Igaz hogy már megvan, de azért ideírom:
sed -n -e sorszamp /path/to/file
--
Debian - The "What?!" starts not!
http://nyizsa.uni.cc
- A hozzászóláshoz be kell jelentkezni