разделение файла на файлы max n-chars меньшего размера без обрезки строки - PullRequest
0 голосов
/ 15 апреля 2020

Вот пример текстового файла ввода, сгенерированного командой cal:

$ cal 2743 > sample_text

В этом примере этот файл содержит 2180 символов

$ wc sample_text
  36  462 2180 sample_text

Я хочу разбить его на более мелкие файлы каждый из которых имеет не более 700 строк, но сохраняет строки в полном состоянии (ни одна строка не может быть обрезана)

Я могу просмотреть каждый такой блок с помощью следующего кода awk:

$ awk '{l=length+l;if(l<=700){print l,$0}else{l=length;print "\nnext block\n",l,$0}}' sample_text
32                             2743
98       January               February               March
164 Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
230                 1  2      1  2  3  4  5  6      1  2  3  4  5  6
296  3  4  5  6  7  8  9   7  8  9 10 11 12 13   7  8  9 10 11 12 13
362 10 11 12 13 14 15 16  14 15 16 17 18 19 20  14 15 16 17 18 19 20
428 17 18 19 20 21 22 23  21 22 23 24 25 26 27  21 22 23 24 25 26 27
494 24 25 26 27 28 29 30  28                    28 29 30 31
560 31
560
626        April                  May                   June
692 Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa

next block
 66              1  2  3                     1         1  2  3  4  5
132  4  5  6  7  8  9 10   2  3  4  5  6  7  8   6  7  8  9 10 11 12
198 11 12 13 14 15 16 17   9 10 11 12 13 14 15  13 14 15 16 17 18 19
264 18 19 20 21 22 23 24  16 17 18 19 20 21 22  20 21 22 23 24 25 26
330 25 26 27 28 29 30     23 24 25 26 27 28 29  27 28 29 30
396                       30 31
396
462         July                 August              September
528 Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
594              1  2  3   1  2  3  4  5  6  7            1  2  3  4
660  4  5  6  7  8  9 10   8  9 10 11 12 13 14   5  6  7  8  9 10 11

next block
 66 11 12 13 14 15 16 17  15 16 17 18 19 20 21  12 13 14 15 16 17 18
132 18 19 20 21 22 23 24  22 23 24 25 26 27 28  19 20 21 22 23 24 25
198 25 26 27 28 29 30 31  29 30 31              26 27 28 29 30
264
264
330       October               November              December
396 Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
462                 1  2      1  2  3  4  5  6            1  2  3  4
528  3  4  5  6  7  8  9   7  8  9 10 11 12 13   5  6  7  8  9 10 11
594 10 11 12 13 14 15 16  14 15 16 17 18 19 20  12 13 14 15 16 17 18
660 17 18 19 20 21 22 23  21 22 23 24 25 26 27  19 20 21 22 23 24 25

next block
 66 24 25 26 27 28 29 30  28 29 30              26 27 28 29 30 31
132 31

У меня есть проблема сохранения каждого блока максимум 700 символов в отдельном файле - с помощью следующей команды он создает только один файл.0, и ожидаемые были раздельные файлы file.0, file.1, file.2 и file.3 для этого входного примера

$ awk 'c=0;{l=length+l;if(l<=700){print>"file."c}else{c=c++;l=length;print>"file."c}}' sample_text
$ cksum *
3868619974 2180 file.0
3868619974 2180 sample_text

1 Ответ

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

Это должно сделать это:

BEGIN {
    maxChars = 700
    out = "file.0"
}
{
    numChars = length($0)
    totChars += numChars
    if ( totChars > maxChars ) {
        close(out)
        out = "file." ++cnt
        totChars = numChars
    }
    print > out
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...