#!/usr/bin/perl
use warnings;
use strict;
my $numberfile = "t1";
my $textfile = "t2";
my $fh1; my $fh2;
open($fh1, "<", $numberfile) or die;
my @nums = <$fh1>;
close $fh1;
open($fh2, "<", $textfile) or die;
my @text = <$fh2>;
close $fh2;
foreach my $i (@nums) {
chomp($i);
print $text[$i];
}
:mrgreen: Davon bin ich mal ausgegangen. Sonst wär's aber auch kein Problem, dann müßte man halt Tie::File verwenden, das kennt keine Dateigrößenbegrenzung.marce schrieb:Hoffentlich ist die Datei < 4GB![]()
#!/usr/bin/awk -f
# Aufruf des scriptes je nachdem ob Script Ausführungsrechte hat oder nicht
# mit ausführungsrechten geht:
# ./script.awk zeilennummerdatei textdatei
# oder wenn keine Ausführungsrechte, dann
# awk -f script.awk zeilennummerdatei textdatei
BEGIN { filename="" }
filename == "" { filename = FILENAME; }
filename == FILENAME {ZEILEN[$1]=1; }
filename != FILENAME {if (FNR in ZEILEN) print }
sed -n "$(sed 's#$#p#' filezeilennummer)" target.txt
Sehr schöne Lösung,haveaniceday schrieb:Damit wir einen sed-Einzeiler haben, würde ich es folgendermassen machen:
Code:sed -n "$(sed 's#$#p#' filezeilennummer)" target.txt
BASH schrieb:bash: /usr/bin/sed: Die Argumentliste ist zu lang
Die Perl Lösung unterscheidet sich gegen die SED und AWK Lösung noch darin, dass die Zeilen in der Reihenfolge ausgegeben werden in der sie in der Datei stehen. SED und AWK geben die Zeilen in der Reihenfolge der target.txt aus, egal wie die Zeilennummern in der Zeilennummerndatei sortiert sind. Allerdings bei der SED-Lösung werden diese dann mehrfach hintereinander ausgegeben wenn sich Zeilennummern in der Liste wiederholen würden. Bei der Perl-Lösung wäre also somit auch sichergestellt, wenn Zeilennummern mehrfach vorkommen werden sie auch mehrfach an den entsprechenden Stellen ausgegeben.PERL schrieb:Use of uninitialized value in print at ./test.perl line 20.
robi@lux001:~/test> for i in $(seq 1 500000); do echo das ist die Zeile $i in der Datei; done > target.txt
robi@lux001:~/test> for i in $(seq 2 250 499999 ); do echo $i ; done > filezeilennummer
robi@lux001:~/test> time ./test.perl >/dev/null
real 0m0.142s
user 0m0.112s
sys 0m0.030s
robi@lux001:~/test> time ./test.perl >/dev/null
real 0m0.141s
user 0m0.107s
sys 0m0.034s
robi@lux001:~/test> time sed -n "$(sed 's#$#p#' filezeilennummer)" target.txt >/dev/null
real 0m1.904s
user 0m1.898s
sys 0m0.004s
robi@lux001:~/test> time sed -n "$(sed 's#$#p#' filezeilennummer)" target.txt >/dev/null
real 0m1.748s
user 0m1.741s
sys 0m0.004s
robi@lux001:~/test> time ./test.awk filezeilennummer target.txt > /dev/null
real 0m0.101s
user 0m0.097s
sys 0m0.004s
robi@lux001:~/test> time ./test.awk filezeilennummer target.txt > /dev/null
real 0m0.094s
user 0m0.089s
sys 0m0.004s
robi@lux001:~/test>