Angenommen, ich habe einen Befehl, command
der eine große Anzahl von Zeilen an stdout ausgibt:
line1
line2
.....
lineN
Ich möchte die Ausgabe auf der Festplatte speichern, aber nicht als einzelne Datei, sondern als eine Folge von Dateien mit jeweils 1000 Zeilen stdout:
file0001.txt:
-------------
line1
....
line1000
file0002.txt:
-------------
line1001
....
line2000
etc
Ich habe versucht, die Antwort zu googeln, aber jedes Mal, wenn Google mich auf tee
Befehl verweist , ist dies in dieser Situation nutzlos. Wahrscheinlich gebe ich falsche Abfragen ein.
quelle
split [arguments...] [input e.g. "-" for stdin] [output_prefix]
zum Beispiel so,tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-
dass ein Bündel von 100-MB-Dateien mit den Namensomedir.tar.part-000
001, 002 und so weiter ausgegeben wird .Sie können ein Bash-Skript verwenden
lines.bash
und benutze es als:
cat long_file.txt | bash lines.bash
Das einzige Problem, das mir aufgefallen ist, ist die
*
Anmeldunglong_file.txt
(jemand könnte es korrigieren).quelle
IFS
auf leere Zeichenfolge, um das Aufteilen von Wörtern zu vermeidenread
. Verwenden Sie-r
diese Option, um das Entstehen von Backslash zu deaktivierenread
. Entfernen-e
, um ein Entweichen des Backslashs zu vermeidenecho
. Verwenden Sie Anführungszeichen, um das Teilen von Wörtern zu vermeidenecho
. Verwenden Sie-v
inbash
since 4.0 zu vermeiden , dass ein Teilprozess zu starten. Verwenden Sie die Post-Inkrementierung, da Ihr aktueller Code in der ersten Datei nur 999 Zeilen enthält.a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
printf
hat nicht-v
. (bash 4.2.10
). Zumindest ist es nicht in der Manpage vonprintf
man printf
documents / usr / bin / printf, die niemals im Leben eine Umgebungsvariable setzen könnten. Weiterehelp printf
Informationen zur integriertenprintf
Shell finden Sie in der Dokumentation.++/
Teil zu geben.