разбить большой текстовый файл на куски по строкам, содержащим указанный c символ - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь разбить большой текстовый файл (~ 27 Гб) на ряд меньших файлов, где точки прерывания определяются подзаголовком, каждый из которых содержит один и тот же символ (в данном случае '@').

Итак, следующий большой файл:

@auniquestring
dataline1
dataline2
...
dataline33456
@aseconduniquestring
dataline33458
dataline33459
...
dataline124589
@athirdunqiuestring
dataline124591
dataline124592
...

... становится:

1-й файл:

@auniquestring
dataline1
dataline2
...
dataline33456

2-й файл:

@aseconduniquestring
dataline33458
dataline33459
...
dataline124589

3-й файл:

@athirdunqiuestring
dataline124591
dataline124592
...

et c

Я пробовал что-то вроде sed -n '/@/,/@/p' myfile, но выводит все сразу и пропускает содержимое всех остальных подзаголовок. Любая помощь будет высоко ценится

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Использование awk (УВЕДОМЛЕНИЕ, ЧТОБЫ СОЗДАТЬ ФАЙЛЫ ИМЕНИ file[0-9]+.txt):

$ awk '
BEGIN {
    file="file0.txt"               # just in case
}
/^@/ {                             # when record starts with @
    close(file)                    # close previous file
    file=sprintf("file%d.txt",++f) # generate next filename
}
{
    print > file                   # output to generated filename
}' file

Пример вывода:

$ cat file1.txt
@auniquestring
dataline1
dataline2
...
dataline33456
0 голосов
/ 03 апреля 2020

Современные Bash версии могут сравнивать регулярные выражения.

#! /bin/bash
n=1
while read -r line; do
  if [[ $line =~ ^@ ]]; then
    exec >file$((n++))
  fi
  printf "%s\n" "$line"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...