我需要编辑csv文件。任务是将姓名和姓氏的第一个字母改为大写(姓名或姓名姓氏->姓名姓氏(,我已经完成了。但另一项任务是设置电子邮件。需要使用姓名设置电子邮件,例如(John Wick->jwick@mail.com),并且如果存在另一个相同的电子邮件(Joe Wick->jwick@mail.com),需要更改秒为jwick@mail1.com…如果还有其他jwick@mail2.com.
name_new这是一个编辑名称email_new编辑过的电子邮件(我还没有完成(check_same是数组,我附加了所有电子邮件(没有@mail.ru和数字(
while IFS="," read id name location job email
do
unset name_new
unset email_new
declare -a check_same
if [ "$id" == id ]; then
echo "${id},${name},${email}"
continue
fi
for n in $name; do
if [ -z "$name_new" ]
then
name_new=${n^} #name
email_new=${n:0:1} #first letter of name
email_new=${email_new,,} #lowercase letter
else
name_new+=" ${n^}" #surname
email_new+=${n,,} #lowercase surname for email
check_same+=($email_new) #append
#need to add domain @mail.ru or 1@mail.ru 2@mail.ru if it not unique mail name
fi
done
echo "${id},${name_new},${email_new}"
done < member.csv
立即声明:
sysadmin@server:~/final$ ./final_1
id,name,email
1,Andriy Marashnichenko,amarashnichenko (need change to amarashnichenko@mail.ru)
**2,Peter Yan,pyan** (need change to pyan@mail.ru)
3,Wesley Brown,wbrown
4,Shuhrat Yusupov,syusupov
5,Nina Kravets,nkravets
6,Inna Shin,ishin
**7,Peter Yan,pyan** (need change to pyan1@mail.ru)
....
**34,Pavel Yan,pyan** (pyan2@mail.ru)
我希望你明白了。我尝试了更多的东西。我疲于解决它,我不知道该怎么办。
使用shell循环几乎可以肯定是错误的方法。有些情况下你真的无法避免,但这似乎不是其中之一。另请参阅为什么使用shell循环处理文本被认为是不好的做法?在我们的兄弟网站Unix&Linux。
我的建议是切换到Awk,它在检查和操作文本方面具有相当相似的功能。
awk -F "," 'BEGIN { OFS=FS }
NR>1{
n = split($2, name, / /); newname = "";
for (i=1; i<=n; ++i)
newname = newname " " toupper(substr(name[i], 1, 1)) tolower(substr(name[i], 2))
if ($2 ~ /(^| )[a-z]/) {
$2 = substr(newname, 2)
}
mailid = tolower(substr(name[1], 1, 1)) tolower(name[n])
suffix = 0
while (seen[mailid suffix])
++suffix
++seen[mailid suffix]
mailid = mailid (suffix > 0 ? suffix : "")
$NF = mailid "@mail.ru"
} 1' member.csv
你的要求也有些不一致,但至少我希望这能引导你朝着正确的方向前进。您提供的样本数据的输出是
id,name,email
1,Andriy Marashnichenko,amarashnichenko@example.ru
2,Peter Yan,pyan@example.ru
3,Wesley Brown,wbrown@example.ru
4,Shuhrat Yusupov,syusupov@example.ru
5,Nina Kravets,nkravets@example.ru
6,Inna Shin,ishin@example.ru
7,Peter Yan,pyan1@example.ru
34,Pavel Yan,pyan2@example.ru
(除了我在这里用example.ru
替换了mail.ru
,以避免无辜的第三方的收件箱暴露在新的垃圾邮件中(。
更详细地说,NR>1
跳过标题行(我们相信第一行是标题,而不是与id
进行比较(。我们保留一个数组seen
,其中每个地址都有一个数字后缀,以在一定程度上简化后续逻辑。(因此,第一个用户将作为flastname0
存储在seen
关联数组中,第二个用户作为flastname1
等(。其余的应该相当明显;CCD_ 9提取子字符串,CCD_。我们将空白上的第二个字段(名称(拆分到数组name
中,然后将它们重新组合成大小写正确的版本。
怎么样
awk '
BEGIN {FS = OFS = ","}
NR > 1 {
email = $3 (count[$3] ? count[$3] : "") "@mail.ru"
count[$3]++
$3 = email
}
{print}
' member.csv