710 Stimmen

Wie kann ich eine große Textdatei in kleinere Dateien mit der gleichen Anzahl von Zeilen aufteilen?

Ich habe eine große (nach Anzahl der Zeilen) reine Textdatei, die ich in kleinere Dateien aufteilen möchte, ebenfalls nach Anzahl der Zeilen. Wenn meine Datei also etwa 2 Mio. Zeilen hat, möchte ich sie in 10 Dateien mit 200k Zeilen oder 100 Dateien mit 20k Zeilen aufteilen (plus eine Datei mit dem Rest; dass sie gleichmäßig teilbar ist, spielt keine Rolle).

Ich könnte dies ziemlich leicht in Python tun, aber ich frage mich, ob es irgendeine Art von Ninja Weg, dies zu tun mit Bash und Unix-Dienstprogramme (im Gegensatz zu manuell Schleife und Zählen / Partitionierung Zeilen).

3 Stimmen

Nur aus Neugier: Wie kann man sie nach dem "Aufteilen" "kombinieren"? Etwas wie "cat part2 >> part1"? Oder gibt es ein anderes Ninja-Dienstprogramm? Könnten Sie Ihre Frage aktualisieren?

14 Stimmen

Um es wieder zusammenzusetzen, cat part* > original

12 Stimmen

Ja, cat ist die Abkürzung für concatenate. Im Allgemeinen ist apropos nützlich, um geeignete Befehle zu finden. Siehe z.B. die Ausgabe von: apropos split

2voto

Matiji66 Punkte 619

HDFS getmerge kleine Datei und Aufteilung in eine angemessene Größe.

Diese Methode führt zu Zeilenumbrüchen:

split -b 125m compact.file -d -a 3 compact_prefix

Ich versuche, jede Datei in ca. 128 MB zusammenzufassen und aufzuteilen.

# Split into 128 MB, and judge sizeunit is M or G. Please test before use.

begainsize=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk '{ print $1}' `
sizeunit=`hdfs dfs -du -s -h /externaldata/$table_name/$date/ | awk '{ print $2}' `
if [ $sizeunit = "G" ];then
    res=$(printf "%.f" `echo "scale=5;$begainsize*8 "|bc`)
else
    res=$(printf "%.f" `echo "scale=5;$begainsize/128 "|bc`)  # Celling ref http://blog.csdn.net/naiveloafer/article/details/8783518
fi
echo $res
# Split into $res files with a number suffix. Ref:  http://blog.csdn.net/microzone/article/details/52839598
compact_file_name=$compact_file"_"
echo "compact_file_name: "$compact_file_name
split -n l/$res $basedir/$compact_file -d -a 3 $basedir/${compact_file_name}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X