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

Wie teilt man eine Datei und behält die erste Zeile in jedem der Teile bei?

Dieser Einzeiler teilt die große CSV-Datei in Stücke von 999 Datensätzen auf, wobei die Kopfzeile am Anfang jedes Datensatzes erhalten bleibt (also 999 Datensätze + 1 Kopfzeile =1000 Zeilen)

cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'

Basierend auf der Antwort von Ole Tange.

In den Kommentaren finden Sie einige Tipps zur parallelen Installation


Das ist robhruskas Skript etwas aufgeräumt:

tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat "$file" >> tmp_file
    mv -f tmp_file "$file"
done

Ich habe wc entfernt , cut , ls und echo an den Stellen, wo sie unnötig sind. Ich habe einige der Dateinamen geändert, um sie etwas aussagekräftiger zu machen. Ich habe es in mehrere Zeilen aufgeteilt, nur um es leichter lesbar zu machen.

Wenn Sie Lust haben, können Sie mktemp verwenden oder tempfile um einen temporären Dateinamen zu erstellen, anstatt einen fest codierten zu verwenden.

Bearbeiten

Mit GNU split Folgendes ist möglich:

split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

Zur besseren Lesbarkeit aufgeschlüsselt:

split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

Wenn --filter angegeben ist, split führt den Befehl (in diesem Fall eine Funktion, die exportiert werden muss) für jede Ausgabedatei aus und setzt die Variable FILE , in der Umgebung des Befehls, zum Dateinamen.

Ein Filterskript oder eine Funktion könnte den Ausgabeinhalt oder sogar den Dateinamen beliebig manipulieren. Ein Beispiel für letzteres könnte die Ausgabe in einen festen Dateinamen in einem variablen Verzeichnis sein:> "$FILE/data.dat" zum Beispiel.


Sie könnten die neue --filter-Funktionalität in GNU coreutils split>=8.13 (2011) verwenden:

tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'

Linux
  1. So extrahieren Sie die tar.gz-Datei in Linux mithilfe der Befehlszeile

  2. Wie kann man die Zeilen einer Datei durchlaufen?

  3. Wie analysiert man jede Zeile einer Textdatei als Argument für einen Befehl?

  4. Wie füge ich in Bash nach jeder Zeile in einer Datei eine Zeichenfolge hinzu?

  5. Wie kann ich die Größe jeder Datei und jedes Verzeichnisses auflisten und in Bash nach absteigender Größe sortieren?

So erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit in Python

So verwenden Sie Sudo und die Sudoers-Datei

So speichern Sie eine Datei in Vim / Vi und beenden den Editor

Wie finde ich den Typ einer Img-Datei und mounte sie?

Wie kann ich grep die Zeilen unter und über jeder übereinstimmenden Zeile drucken lassen?

Wie leite ich stderr und stdout in verschiedene Dateien in derselben Zeile im Skript um?