Сценарий Perl, чтобы прервать вход и запустить новую строку после определенного числа экземпляров

У меня есть сценарий жемчуга для преобразования текстового файла в json.
Сценарий похож на это:

perl -MJSON -F, -lane '
    print to_json ({
           domain => shift @F,
           emails => [map {{email =>$_}} @F]
           }, {canonical=>1})
' input1.txt' > output.json

Этот сценарий пишет вывод в файл в формате JSON.
Я хочу знать, как я могу изменить сценарий для прерывания входа также.
Вот пример:
Входной файл содержит что-то как следующее:

example.com,1@example.com,2@example.com,3@example.com,4@example.com,....

Вывод файл JSON будет:

{"domain":"example.com",emails:[{email:"1@example.com"},{email:"2@example.com"},.....]}

Точка (.) означает, что существуют другие электронные письма, добавляемые там после.

Теперь то, что я хочу иметь, если электронная почта превышает 21, то сценарий должен записать в новую строку в выходном файле

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

example.com,1@example.com,2@example.com,3@example.com,4@example.com,....500@example.com

Вывод должен быть:

{"domain":"example.com",emails:[{email:"1@example.com"},{email:"2@example.com"},.....,{email:21@example.com}]}
{"domain":"example.com",emails:[{email:"22@example.com"},{email:"23@example.com"},.....]}
{"domain":"nextdomain.com",emails:[{email:"1@nextdomain.com"},{email:"2@nextdomain.com"},.....]}

И процесс продолжается.

1
задан 28 January 2017 в 15:57

1 ответ

Используйте соединение встык для удаления первого 21 элемента массива в цикле:

perl -MJSON -F, -lane '
    $domain = shift @F;
    while (@f = splice @F, 0, 21) {
        print to_json ({
           domain => $domain,
           emails => [ map { { email => $_ } } @f ]
        }, { canonical => 1 });
    }
'
4
ответ дан 3 December 2019 в 06:55

Другие вопросы по тегам:

Похожие вопросы: