Ich möchte eine Textdatei nach einem vordefinierten Satz von Zeilen aufteilen.
Zum Beispiel. Ich habe eine Datei
a
b
c
d
e
f
Und dann habe ich die folgenden Sätze von Zeilen (diese könnten jedoch bequemer in einer Datei, mehreren Dateien usw. gespeichert werden).
1,2
3,6
5,4
Ich möchte meine Datei aufteilen, damit ich 3 Dateien zurückbekomme wie:
Datei1
a
b
Datei2
c
f
Datei3
e
d
Akzeptierte Antwort:
Hier ist eine bash
Skript unter der Annahme, dass Ihre Eingabedatei infile heißt und die Bereiche 1-pro-Zeile in einer Datei namens splits:
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
Dazu wird einfach sed
verwendet um die durch die Bereiche angegebenen Zeilen zu drucken, und speichert jedes Ergebnis als eine neue Datei (die erstellten Dateien heißen Datei1 Datei2 Datei3 usw.). Zwei Aufrufe von sed
werden verwendet, um die angegebene Reihenfolge der Zeilen beizubehalten.
Beachten Sie, dass dieses einfache Skript keine Format- oder Fehlerprüfung durchführt und vorhandene Dateien mit Namen wie z. file1 wird überschrieben.
Eine vereinfachte Alternative (mit freundlicher Genehmigung von @muru) mit while read
und Bash die Bereiche aufteilen lassen, anstatt sie zu schneiden:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Wenn die Reihenfolge der Zeilen in den Ausgabedateien wichtig ist (z. B. Zeilen 5,4 !=4,5), dann wird der sed
bit muss ähnlich wie beim ersten Skript in zwei separate Aufrufe aufgeteilt werden.