Попробуйте вместо этого простой perl-однострочный (ну, почти однострочный) вместо этого:
echo 'JACOB2345@gmail.com:YdjfkoweU, LUKE453@gmail.com:YdjfkoweU, WESLEY233@gmail.com:YdjfkoweU, Bruce2423@gmail.com:YdjfkoweU, Angel@gmail.com:YdjfkoweU, Lukder@gmail.com:YdjfkoweU, ' | \
perl -F'/,\s*/' -lane '
BEGIN {
$out_rec_sep = "\t";
print join $out_rec_sep, map { "FIELD$_" } (1..2);
}
foreach $rec ( @F ) {
print join $out_rec_sep, split m{:}, $rec;
}'
Печать в STDOUT (который можно перенаправить в файл, используя > out_file
):
FIELD1 FIELD2
JACOB2345@gmail.com YdjfkoweU
LUKE453@gmail.com YdjfkoweU
WESLEY233@gmail.com YdjfkoweU
Bruce2423@gmail.com YdjfkoweU
Angel@gmail.com YdjfkoweU
Lukder@gmail.com YdjfkoweU
Если вам нужен вывод csv (через запятую) вместо вывода tsv (через табуляцию), выберите $out_rec_sep = ",";
.
В вашем коде есть несколько проблем.
Входные данные ограничены ,
, затем в каждой записи :
. В подобных случаях почти всегда проще использовать split
с этими очевидными общими разделителями. Сначала разбейте входные данные на записи, затем разбейте каждую запись на поля. Это очень распространенная идиома программирования.
Ваш метод использования регулярных выражений для удаления разделителей и последующего разделения на .com
приводит к более длинному и более запутанному коду (избавляется от структуры ввода с 2 разделителями), склонен к ошибкам (как вы заметили) и не устойчив к изменениям во входных данных (подумайте, заканчиваются ли некоторые электронные письма .edu
, .org
и т. д.?).