Teilen Sie die Zeilen einer Textdatei in separate Dateien auf

7

Ich habe eine Textdatei, die ungefähr so ​​aussieht:

foo
bar
zip
rar
tar

Ich muss ein Bash-Skript unter OSX verwenden, um nach jeder neuen Zeile wie folgt eine neue Textdatei zu erstellen:

cat text1.txt
foo
cat text2.txt
bar
cat text3.txt
zip
cat text4.txt 
rar
cat text5.txt
tar
Anzeigename
quelle

Antworten:

8

Sie können verwenden csplit. Es macht den Job gut, außer dass es in Bezug auf die Namen der Ausgabedateien etwas unflexibel ist (Sie können nur ein Präfix angeben, kein Suffix) und Sie benötigen einen ersten Durchgang, um die Anzahl der Teile zu berechnen.

csplit -f text -- input.txt '//' "{$(wc -l input.txt)}"
for x in text[0-9]*; do mv -- "$x" "$x.txt"; done

Die GNU-Version, jedoch nicht die OSX-Version, verfügt über Erweiterungen, die beide Probleme lösen.

csplit -b '%d.txt' -f text -- input.txt '//' '{*}'

Alternativ csplitkönnen Sie awk verwenden , wenn dies zu unflexibel ist.

awk '{filename = sprintf("text%d.txt", NR); print >filename; close(filename)}' input.txt
Gilles 'SO - hör auf böse zu sein'
quelle
awk: text18.txt makes too many open files input record number 18, file ~/Desktop/namnlös mapp/flash varibales3.txt source line number 1
DisplayName
@DisplayName Hoppla, Dateien müssen geschlossen werden. Bearbeitet.
Gilles 'SO - hör auf böse zu sein'
2

Version mit purer Bash ...

unset i; while read -r l; do echo $l > "text$((++i)).txt";done < text_file.txt
Miroslav Franc
quelle
1

Angenommen, der Inhalt der Textdatei enthält keine Leerzeichen, können Sie auch eine for-Schleife in Bash verwenden.

$ for x in $(<file.txt); do echo "$x" > text$((++i)).txt; done

Beispiel

$ cat file.txt 
foo
bar
zip
rar
tar

Jetzt mit $inicht gesetzt.

$ unset i
$ for x in $(<file.txt);do echo "$x" > text$((++i)).txt;done
$ ls -l text*
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text1.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text2.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text3.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text4.txt
-rw-rw-r--. 1 slm slm 4 Oct 29 22:03 text5.txt

Bestätigung der Ergebnisse:

$ head text*
==> text1.txt <==
foo

==> text2.txt <==
bar

==> text3.txt <==
zip

==> text4.txt <==
rar

==> text5.txt <==
tar
slm
quelle