2010-08-30 8 views
12

Ich habe zwei Dateien, die ich zusammen erfassen möchte. Die letzte Zeile der ersten Datei und die erste Zeile der letzten Datei sollten jedoch weggelassen werden.Wie man zwei Dateien hintereinander kettet, aber die letzte/erste Zeile weglässt?

Ich bin sicher, dass dies in einer UNIX-Shell (oder besser gesagt, Cygwin) getan werden kann. Aber wie?

+2

Wir brauchen wirklich eine scriptingOverflow Website .... – leppie

+1

@leppie, einige von uns glauben, dass Scripting so viel Programmierung ist wie Kompilieren :-) – paxdiablo

Antwort

15
$ head --lines=-1 file1 > res 
$ tail --lines=+2 file2 >> res 
3

Sie verwenden können:

head -n -1 file1 && tail -n +2 file2 

Kopf zeigt die ersten Zeilen einer Datei zeigt die param -n die ersten n Zeilen der Datei, aber wenn Sie ein setzen - vor der Nummer, es zeigt alle die Datei außer den letzten n Zeilen.

Schwanz ist analog ..

für bessere Referenz:

Mannhead

Manntail

+0

tail 1 die erste Zeile enthält. es sollte +2 sein. – Frank

+0

yeah, ich habe geschrieben und dann getestet: P – Marco

+0

seltsam, 'tail -n -1' hat den gleichen Effekt wie' tail -n + 2' – bastibe

1

Das folgende Transkript zeigt, wie dies acheive:

pax> cat file1.txt 
1.1 
1.2 
1.3 
1.4 
1.5 

pax> cat file2.txt 
2.1 
2.2 
2.3 
2.4 
2.5 

pax> head --lines=-1 file1.txt ; tail --lines=+2 file2.txt 
1.1 
1.2 
1.3 
1.4 
2.2 
2.3 
2.4 
2.5 

Geben Sie den head Befehl eine negative Zählung geht bis zu dem Ende weit. In ähnlicher Weise beginnt eine Zählung, die mit + beginnt, tail, um an dieser Zeile statt einer bestimmten Anzahl von Zeilen vom Ende zu beginnen.

1
head -n -1 file1 

werden alle Zeilen in file1 mit Ausnahme der letzten Zeile gedruckt.

tail -n +2 file2 

werden alle Linien in file2 mit Ausnahme der ersten Zeile drucken.

Kombinieren Sie die beiden als:

head -n -1 file1 ; tail -n +2 file2 
2
awk 'FNR>2{print p}{p=$0}' file1 file2 

Erklärung wie gewünscht:

FNR die aktuelle Datensatznummer der aktuellen Datei verarbeitet wird. Zu Beginn jeder Iteration wird die Zeile in der Variablen "p" gespeichert, aber noch nicht ausgedruckt. Wenn die Datensatznummer 3 erreicht, wird die Variable "p" ausgedruckt, die den Datensatz 2 enthält. Dies bedeutet die zweite Zeile. Wenn awk das Ende der Datei erreicht, wird die letzte Zeile nicht ausgedruckt und dann geht es zur nächsten Datei.

+0

ghostdog74 erleuchte uns mit was los ist hier :) – codaddict

+0

Ist das nicht Entfernen Sie die erste und letzte Zeile aus _both_ Dateien? Frage war für letzte Zeile der ersten Datei und erste Zeile der zweiten Datei, war es nicht? – paxdiablo

1

Ich bin nicht in der Lage den folgenden Befehl auf meinem Mac (genauer gesagt in einer Bash-Shell läuft in einem Terminal-Fenster auf Mac OS X 10.7.5) zu verwenden:

head -n -1 file1 

Der obige Befehl erzeugt die Folgende Fehlermeldung:

head: illegal line count -- -1 

Es scheint negative Werte für den Parameter -n sind nicht akzeptiert in der Mac OS X-Version von head.Sie können jedoch stattdessen sed verwenden:

sed -e '$d' file1 

[ "tail -n 2 file2" erscheint, wie oben unter Mac OS X beschrieben arbeiten]

0

ich oft sed für Kopf verwenden | tail Aktionen:

{ sed '$d' file1; sed '1d' file2; } > combined