Bash как разбить файл на пустую строку с помощью awk - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть текстовый файл (A.in), и я хочу разбить его на несколько файлов.Разделение должно происходить каждый раз, когда найдена пустая строка.Имена файлов должны быть прогрессивными (A1.in, A2.in, ..)

Я нашел этот ответ, который предлагает использовать awk, но я не могу заставить его работать с моимжелаемое соглашение об именах

awk -v RS="" '{print $0 > $1".txt"}' file

Я также нашел другие ответы , говорящие мне использовать команду csplit -l, но я не могу сделать так, чтобы она соответствовала пустым строкам, я попытался сопоставить шаблон '' но я не очень знаком с регулярными выражениями, и я получаю следующий

bash-3.2$ csplit A.in ""
csplit: : unrecognised pattern

Входной файл:

A.in

4 
RURDDD

6
RRULDD
KKKKKK

26
RRRULU

Желаемый выход:

A1.in

4 
RURDDD

A2.in

6
RRULDD
KKKKKK

A3.in

26
RRRULU

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Еще одно исправление для awk:

$ awk -v RS="" '{
    split(FILENAME,a,".")  # separate name and extension
    f=a[1] NR "." a[2]     # form the filename, use NR as number
    print > f              # output to file
    close(f)               # in case there are MANY to avoid running out f fds
}' A.in
0 голосов
/ 20 декабря 2018

Содержимое входного файла:

$ cat A.in 
4 
RURDDD

6
RRULDD
KKKKKK

26
RRRULU

Содержимое файла AWK:

BEGIN{
    n=1
}
{
    if(NF!=0){
        print $0 >> "A"n".in"
    }else{
        n++
    }
}

Исполнение:

awk -f ctrl.awk A.in

Вывод:

$ cat A1.in 
4 
RURDDD

$ cat A2.in 
6
RRULDD
KKKKKK

$ cat A3.in 
26
RRRULU

PS: однострочное выполнение без файла AWK:

awk 'BEGIN{n=1}{if(NF!=0){print $0 >> "A"n".in"}else{n++}}' A.in
0 голосов
/ 20 декабря 2018

В любом нормальном случае должен работать следующий сценарий:

awk 'BEGIN{RS=""}{ print > ("A" NR ".in") }' file

Причина, по которой это может быть неудачным, наиболее вероятна из-за некоторых завершений CRLF (см. здесь и здесь ).

Как уже упоминал Джеймс, сделав его немного более надежным, как:

awk 'BEGIN{RS=""}{ f = "A" NR ".in"; print > f; close(f) }' file

Если вы хотите использовать csplit, то сработает следующее:

csplit --suppress-matched  -f "A" -b "%0.2d.in" A.in '/^$/' '{*}'

См. man csplit для понимания вышесказанного.

...