2017-01-18 10 views
1

Ich versuche, eine neue Datei (zB file3) zu erstellen, indem ich zwei Dateien (file1 und file2) zusammenstapel. Ich brauche die Gesamtheit von file1 aber möchte die erste Reihe von file2 ausschließen. Was ich jetzt habe, ist ein zweistufiger Prozess unter Verwendung von head und sed.Wie verketten Sie zwei Dateien (Entfernen der ersten Zeile der zweiten Datei) in einer einzigen Zeile von Unix-Befehl?

cat file1.csv file2.csv > file3.csv 
sed -i 1001d file3.csv 

Der letzte Schritt erfordert mich die Länge file1, um herauszufinden, bevor die Leitung nach so entfernen, dass es auf die erste Zeile von file2 entspricht. Wie kombiniere ich diese beiden Zeilen zu einer einzigen Codezeile? Ich habe das versucht und es ist fehlgeschlagen:

cat file1.csv sed 1d file2.csv > file3.csv 
+0

[Bearbeiten] Ihre Frage prägnant, prüfbare Abtastwerteingang und erwartete Ausgabe aufzunehmen. –

+0

Hat meine Antwort oder andere Ihr Problem gelöst? Wenn ja, dann überlege dir bitte, ob du es als Antwort akzeptierst - indem du auf das grüne Häkchen neben der Stimmenzahl klickst. Wenn nicht, sag bitte, was nicht funktioniert hat, damit ich oder jemand anderes dir weiter helfen kann. Vielen Dank. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –

Antwort

1

Sie können eine zusammengesetzte Anweisung wie folgt verwenden:

{ cat file1.csv; sed '1d' file2.csv; } > file3.csv 
+0

Das funktioniert. Vielen Dank! Was ist die Logik des Codes innerhalb der geschweiften Klammern? –

+0

Die erste Anweisung druckt den Inhalt von 'file1.csv' und die zweite Anweisung druckt den Inhalt von' file2.csv' aber löscht/Ignoriere die erste Zeile wegen '1d'.Die kombinierte Ausgabe der beiden Anweisungen wird dann in 'file3.csv' geschrieben. Genau wie du es wirklich verlangt hast ;-) –

0

Ein Weg ist cat file1.csv > file3.csv; tail -n +2 file2.csv >> file3.csv.

Ein weiteres ist tail -n +2 file2.csv | cat file1.csv - > file3.csv

2

Sie Prozess Substitution verwenden können, wie:

cat file1.csv <(tail -n +2 file2.csv) > file3.csv 
0

Sie Ihren zweiten Versuch verwenden können, aber mit Prozess Substitution:

cat file1.csv <(sed '1d' file2.csv) > file3.csv 

Ihr Befehl ist fehlgeschlagen, da sed wurde als Dateiname behandelt, auf den cat zuzugreifen versuchte.

Wenn Ihre Shell nicht Prozess Substitution unterstützt, können Sie diese stattdessen verwenden:

sed '1d' file2.csv | cat file1.csv - > file3.csv 

Alternativ können Sie awk verwenden:

awk 'FNR!=NR && FNR==1 {next} 1' file{1,2}.csv > file3.csv 

FNR!=NR ist wahr, wenn wir nicht in Die erste Datei (die Datensatznummer entspricht nicht der Gesamtanzahl der Datensätze) und FNR==1 ist in der ersten Zeile jeder Datei gültig. Zusammen ist die Bedingung in der ersten Zeile jeder, aber der ersten Datei wahr; next überspringt diese Zeile. 1 wird alle anderen Zeilen gedruckt.

+0

Ich habe versucht, Ihre erste Option und andere Variationen davon und habe den folgenden Fehler: 'sh .exe ": kann keine Pipe für Prozesssubstitution erstellen: Funktion nicht implementiert" –

+0

Es sieht so aus, als ob Ihre Shell die Prozesssubstitution nicht unterstützt. Ich werde die Antwort aktualisieren. –

+0

Ich benutze git bash –

Verwandte Themen