Ich habe mehrere Dateien wie: (in Wirklichkeit habe ich 80)
file1.dat
2 5
6 9
7 1
file2.dat
3 7
8 4
1 3
Ich möchte mit einer Datei enden, die alle zweiten Zeilen enthält. dh
output.dat
6 9
8 4
Was ich bisher habe, schleift zwar die Dateinamen, überschreibt dann aber die Datei davor. zB wäre die Ausgabe der oben genannten Dateien nur
8 4
Mein Shell-Skript sieht folgendermaßen aus:
post.sh
TEND = 80
TINDX = 0
while [ $TINDX - lt $TEND]; do
awk '{ print NR==2 "input-$TINDX.dat > output.dat
TINDX = $((TINDX+1))
done
awk 'FNR==2' file{1..80}.dat > output.dat
sed
wäre genug:-s
Die Option wird benötigt, um die zweite Zeile aus jeder Datei zu drucken. Andernfalls wird nur die zweite Zeile der ersten Datei gedruckt.quelle
Was ist mit ...
head -n 2 input.dat | tail -n 1 | awk
...quelle
head
/tail
ist definitiv eine Option, die Sie dann nicht brauchenawk
.Die
sed
Lösung von Aragaer ist am schönsten, ja. Aber da ich gernehead|tail
schneide, habe ich einehead|tail
Lösung, die mehrere Dateien unterstützt, nicht nur eineinput.dat
. Die Verwendung einer for-Schleife, anstatt eine Liste von Dateien an sed zu übergeben, erleichtert es auch, andere Dinge mit der Datei vor / nach dem Extrahieren der zweiten Zeile mit sed zu tun.Reichlich kommentierte mehrzeilige Version:
NB: Der folgende Code wird ausgeführt. Es steht uns frei, nach a
|
,&&
oder einen Zeilenumbruch zu setzen||
und unseren Befehl in der nächsten Zeile fortzusetzen. wir können sogar Kommentare dazwischen setzen. Ich habe Jahre damit verbracht, das nicht zu wissen (und es nirgendwo wirklich zu sehen). Dieser Stil ist an der interaktiven Eingabeaufforderung weniger nützlich, bereinigt jedoch Skriptdateien ohne Ende.quelle
Es gibt offensichtlich viele Möglichkeiten, dies zu tun - ich denke, ich mag @ aragaers sed Antwort am besten .
Hier ist eine, die rein bash-integrierte Funktionen verwendet und keine externen Dienstprogramme benötigt:
quelle
Um die Verwendung von
awk
undsed
in Antworten hier für mehrere Dateien effizienter zu gestalten, sollten Sie dienextfile
Anweisung verwenden, um die Verarbeitung unerwünschter Zeilen zu überspringenawk
.und mit
sed
können wir bei der Verarbeitung in der 3. Zeile beenden undsed
die nächste Datei verarbeiten.quelle