GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Eine Datei basierend auf einem vordefinierten Satz von Zeilen aufteilen?

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:

gespeichert werden
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.


Ubuntu
  1. So teilen Sie eine einzelne Datei basierend auf Zeilen in mehrere Dateien auf

  2. csplit:Eine bessere Möglichkeit, Dateien in Linux basierend auf ihrem Inhalt zu teilen

  3. Wie werden CSV-Dateien nach der angegebenen Anzahl von Zeilen aufgeteilt?

  4. unix - teilt eine riesige .gz-Datei zeilenweise auf

  5. Wie setze ich eine Datei als NICHT ausführbar?

So aktivieren und konfigurieren Sie die .htaccess-Datei auf Apache

Ersetzen von Zeichenfolgen in Bash

So richten Sie die NFS-Freigabe unter Ubuntu 20.04, 18.04 ein

Wie teilt man eine MP3-Datei?

sed-Befehlsbeispiele unter Linux

sed:Befehl nicht gefunden