зациклиться на одном или нескольких совпадениях в столбце awk

Вы можете использовать переключатель --parentsдля cp, чтобы сохранить структуру каталогов.

mkdir BASE && cp --parents -a --target-directory=BASE /a/b/c/d

Изменить :извините, вы просили решение для Unix, но это, похоже, только для Linux.:(

0
02.02.2020, 16:41
2 ответа

С помощью GNU awk для FPAT(, а затем, поскольку нам уже требуется gawk, также используя сокращения gensub()и \sдля[[:space:]]):

$ cat tst.awk
BEGIN {
    FPAT = "([^,]*)|(\"[^\"]+\")"
    OFS=","
}
{
    name = gensub(/^"|"$/,"","g",$1)
    n = split(gensub(/^"|"$/,"","g",$2),emails,/\s*[;,|:]\s*/)
    for (i=1; i<=n; i++) {
        print name, emails[i]
    }
}
$
$ awk -f tst.awk file
agrippa,sonny.cipriano@gmail.com
elvirka,alex.martinho18@gmail.com
Inofs,sv1tm@yandex.by
Inofs,Jono_Newton@hotmail.co.uk
bekbz,luca.rinaldi@mtf.ch
bekbz,Toe1966@hotmail.co.uk
njkzif,aa@suisseplan.ch
njkzif,brianlofts@hotmail.co.uk
njycz,flyfishhobby@aol.com
njycz,philip@hugosinbox.xyz
DanielEdict,petebll@josephay905s.changeip.com
JosEmbesy,jw8796384@gmail.com
JosEmbesy,natalavybopvtc@gmail.com
Walterdon,ramostt6547@gmail.com
Walterdon,rueydjc583657@gmail.com
Kennethlob,kostazdanovolrv@gmail.com
Ninosh,silvertoothtiger@gmail.com
Patrickbam,bulldoggym2017@gmail.com

FWIW Я обычно использую подход *sub(/^"|"$/,"",...)для удаления возможных ведущих/обучающих двойных кавычек из полей CSV, поскольку он имеет преимущество перед подходом substr()в том, что он не искажает поле в тех случаях, когда не было двойных кавычек. Цитаты.

Вы также можете добавить обнаружение ошибок в случае искаженных адресов электронной почты или случаев, когда вы забыли обработать (, например. разделитель, отличный от[;,|:]):

$ cat tst.awk
BEGIN {
    FPAT = "([^,]*)|(\"[^\"]+\")"
    OFS=","
}
{
    name = gensub(/^"|"$/,"","g",$1)
    n = split(gensub(/^"|"$/,"","g",$2),emails,/\s*[;,|:]\s*/)
    for (i=1; i<=n; i++) {
        email = emails[i]
        if ( gsub(/@/,"&",email) != 1 ) {
            printf "ERROR: too few or too many email addresses in \"%s\"\n", email | "cat>&2"
            exit 1
        }
        print name, email
    }
}

и если вы ДЕЙСТВИТЕЛЬНО хотели проверить адреса электронной почты, FWIW в течение последних 5 лет или около того без проблем, о которых я знаю, я использовал эту модифицированную версию регулярного выражения из http://www.regular-expressions.info/email.html(, я специально использую [a -zA -Z] вместо [:alpha :], так как я хочу принимать только буквы, которые считаются таковыми в моем регионе -вам решать, что имеет смысл для вашего приложения):

    (email ~ /^[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}$/)
2
28.04.2021, 23:24

Не уверен, что понял ваш комментарий в скобках о 15+ и 7 столбцах, но для приведенного примера попробуйте

awk -F, '


        {gsub (/[" ]/,_)                        # remove double quotes and space all over
         D1 = $1                                # save field 1 and
         sub ($1 FS, _)                         # remove it from line
         n  = split ($0, T, /[,;:\|]/)          # split the residual line into array T
         for (i=1; i<=n; i++) print D1, T[i]    # print former $1, and each T element
        }
' OFS=, file
agrippa,sonny.cipriano@gmail.com
elvirka,alex.martinho18@gmail.com
Inofs,sv1tm@yandex.by
Inofs,Jono_Newton@hotmail.co.uk
.
.
.
Patrickbam,bulldoggym2017@gmail.com
0
28.04.2021, 23:24

Теги

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