Отдельный текстовый файл на несколько файлов на основе определенного шаблона

1

Предположим, у меня есть следующий файл: (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?

Теги:
grep
awk

3 ответа

2
Лучший ответ

Это должно помочь -

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] 
  • 0
    : y Это еще лучше .. Я постараюсь понять, как написано большое спасибо
  • 1
    @ user1421408 Добро пожаловать. То, что мы сделали здесь, это установили разделитель записей в Song . Это отделяет все песни. $0 отмечает все остальное. Поскольку вам нужно слово «Song» в ваших отдельных файлах, мы выводим RS $0 вместо написания слова «Song». ++n гарантирует, что мы запишем каждую запись в новый файл, увеличенный на число. NF гарантирует, что мы не будем писать первый файл как просто Song . Надеюсь это поможет!
4
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/'
  • 0
    Это работает очень хорошо, спасибо :)
3

csplit можно использовать для разделения текстового файла с помощью регулярного выражения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню