Вы можете использовать переключатель --parents
для cp
, чтобы сохранить структуру каталогов.
mkdir BASE && cp --parents -a --target-directory=BASE /a/b/c/d
Изменить :извините, вы просили решение для Unix, но это, похоже, только для Linux.:(
С помощью 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,}$/)
Не уверен, что понял ваш комментарий в скобках о 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