On Son, 19 Jan 2003 at 19:14 (+0100), David Haller wrote:
On Sat, 18 Jan 2003, Jan Trippler wrote:
[...]
Ich verstehe auch nicht, warum das so kompliziert sein muss.
Ich auch nicht ;)
Ich würde das so machen (ich habe mich mal auf rudimentäres
Fehlerhandling beschränkt):
[head + tail]
Naja, da kann man auch gleich head und tail direkt nehmen. Klappt
aber, wie erwaehnt nicht mit stdin (bzw. pipe):
[...]
Daher ja die Verrenkungen...
Ah - jetzt habe ichs geschnallt :-)
Wie wäre es denn dann so (Fehlerprüfung nur rudimentär):
#!/bin/bash
[ -z "$1" -o -z "$2" ] && exit 1
awk ' BEGIN { for ( i = 0; i < t; i ++) l[i] = ""; }
{ if (NR <= h) print $0;
for (i = 0; i < (t - 1); i ++) l[i] = l[i+1];
l[t - 1] = $0; }
END { for ( i = 0; i < t; i ++)
if (l[i] != "") print l[i]; }
' h=$1 t=$2 -
jan@k500:~/tmp> echo -e 'a\nb\nc' | ./headntail_awk 1 1
a
c
Das ist IMHO etwas übersichtlicher (und man könnte Bernds Wünsche
recht fix reinpfriemeln ;-). Die Grundidee ist, intern _vorbeugend_
einen Puffer aufzubauen. Was mittendrin zu holen, sieht dann so aus:
#!/bin/bash
[ -z "$1" -o -z "$2" ] && exit 1
awk ' { if (NR >= a && NR <= e) print $0;
} ' a=$1 e=$2 -
jan@k500:~/tmp> echo -e 'a\nb\nc' | ./middle_of_the_file 2 3
b
c
Jetzt das Ganze noch hübsch garniert (sprich Optionen zur Steuerung
des Verhaltens und Fehlerhandling eingebaut), zusammengerührt -
fertich ist das 3-Gänge-Menü (head - mid - tail ;-). Mit der
Integration des Puffers kann man auch solche Ferkeleien machen, wie:
Hole mir die zehnt- bis drittletzte Zeile.
Jan
P.S.: Hatte ich schon erwähnt, dass ich den awk schick finde?