Ich habe eine ziemlich große Datei (150 Millionen Zeilen von 10 Zeichen). Ich muss es in 150 Dateien von 2 Millionen Zeilen teilen, wobei jede Ausgabezeile alternativ die ersten 5 Zeichen oder die letzten 5 Zeichen der Quellzeile ist. Ich konnte das in Perl ziemlich schnell machen, aber ich fragte mich, ob es eine einfache Lösung mit bash gab. Irgendwelche Ideen?Teilen einer Datei und ihrer Zeilen unter Linux/Bash
Antwort
Hausaufgaben? :-)
Ich würde denken, dass eine einfache Leitung mit sed (um jede Zeile in zwei aufzuteilen) und geteilt (um Dinge in mehrere Dateien aufzuteilen) genug wäre.
Der Mann Befehl ist dein Freund.
nach Bestätigung wird hinzugefügt, dass es keine Hausaufgaben sind:
Wie wäre es
sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-
?
Ich denke, dass so etwas wie dies funktionieren könnte:
out_file=1
out_pairs=0
cat $in_file | while read line; do
if [ $out_pairs -gt 1000000 ]; then
out_file=$(($out_file + 1))
out_pairs=0
fi
echo "${line%?????}" >> out${out_file}
echo "${line#?????}" >> out${out_file}
out_pairs=$(($out_pairs + 1))
done
Nicht sicher, ob es einfacher oder effizienter ist als Perl, though.
Die ersten fünf Zeichen jeder Zeile Variante, unter der Annahme, dass die große Datei x.txt genannt, und unter der Annahme, es ist OK, Dateien im aktuellen Verzeichnis x.txt mit Namen erstellen *:.
geteilt -l 2000000 x .txt x.txt.out & & (für splitfile in x.txt.out *; do outfile = "$ {splitfile} .firstfive"; echo "$ splitfile -> $ outfile"; cut -c 1-5 "$ splitfile ">" $ outfile "; done)
Ich denke, Sie müssen ein bisschen klarer sein, was die Transformation genau ist. (Das heißt, ich verstehe es nicht.) Vielleicht ein kleines Beispiel? – mweerden