Предположим, у меня есть следующий файл: (Song.txt)
Song one
bla bla bla bla
bla bla bla bla bla
Song two
yaya ya yaa
blaaa bla bla blaaaaa
Song three
bla bla bla
Я хочу разделить этот файл на три файла, чтобы они выглядели следующим образом:
Первое имя файла должно быть Song_1.txt
Song One
bla bla bla bla
bla bla bla bla bla
Второе имя файла должно быть Song_2.txt
Song two
yaya ya yaa
blaaa bla bla blaaaaa
Третье имя файла должно быть Song_3.txt
Song three
bla bla bla
Как это сделать, используя awk, grep, perl, python и/или любые инструменты и языки на основе unix?
Это должно помочь -
gawk -v RS="Song" 'NF{ print RS$0 > "Song_"++n".txt" }' Song.txt
[jaypal:~/Temp] cat Song.txt
Song one
bla bla bla bla
bla bla bla bla bla
Song two
yaya ya yaa
blaaa bla bla blaaaaa
Song three
bla bla bla
[jaypal:~/Temp] gawk -v RS="Song" 'NF{ print RS$0 > "Song_"++n".txt" }' Song.txt
[jaypal:~/Temp] ls -l S*
-rw-r--r-- 1 jaypalsingh staff 113 28 May 17:55 Song.txt
-rw-r--r-- 1 jaypalsingh staff 47 28 May 18:06 Song_1.txt
-rw-r--r-- 1 jaypalsingh staff 45 28 May 18:06 Song_2.txt
-rw-r--r-- 1 jaypalsingh staff 24 28 May 18:06 Song_3.txt
[jaypal:~/Temp] cat Song_1.txt
Song one
bla bla bla bla
bla bla bla bla bla
[jaypal:~/Temp] cat Song_2.txt
Song two
yaya ya yaa
blaaa bla bla blaaaaa
[jaypal:~/Temp]
csplit Song.txt --elide-empty-files --prefix=Song_ --suffix-format='%1d.txt' '/Song one/' '/Song two/' '/Song three/'
или
csplit Song.txt -z -f Song_ -b '%1d.txt' '/Song one/' '/Song two/' '/Song three/'
csplit
можно использовать для разделения текстового файла с помощью регулярного выражения.
Song
. Это отделяет все песни.$0
отмечает все остальное. Поскольку вам нужно слово «Song» в ваших отдельных файлах, мы выводимRS $0
вместо написания слова «Song».++n
гарантирует, что мы запишем каждую запись в новый файл, увеличенный на число.NF
гарантирует, что мы не будем писать первый файл как простоSong
. Надеюсь это поможет!