bash脚本将输出转换为数组并删除重复项

时间:2020-07-13 10:37:39

标签: arrays bash

我有一个功能,可以输出在大型文本文件中找到的电子邮件地址列表,并输出如下:

Testing@outlook.com
Some_Email@gmail.com
Testing@outlook.com
Some_Email@gmail.com
John.Doe@test.com
Smith@hello.co.uk, orange123@testing.com
John.Doe@test.com
Smith@hello.co.uk, orange123@testing.com
contact@email.com
support@email.com, contact@email.com

我需要将此输出转换为逗号分隔的电子邮件地址数组,可以在for循环中对其进行迭代,我也想删除重复项。

我尝试了sed的一些变体,但实际上并不能做我想做的事。任何提示都是很棒的。

2 个答案:

答案 0 :(得分:1)

这是快速而肮脏的awk,它将为您做到这一点:

awk 'BEGIN{FS="[[:blank:],]+"; OFS=","}{for(i=1;i<=NF;++i) a[tolower($i)]}
     END{s=""; for(i in a) s=s (s?OFS:"") i; print s}' file

这将处理大小写不同的重复电子邮件。它不会对列表进行排序。

如果您希望订单相同,我会这样做:

awk 'BEGIN{FS="[[:blank:],]+"; OFS=","}
     { for (i=1;i<=NF;++i) {
         e=tolower($i)
         if (!(e in a)) { printf (p==0?"":OFS) "%s", e; a[e]; p=1 }
     }}' file

答案 1 :(得分:0)

您是否尝试过仅将'\ n'替换为','?在运行sed之前对-u进行排序将确保唯一值(无重复)

我复制了您的电子邮件列表,并将其粘贴到email.txt

sort -u email.txt -o email.txt && sed -i ':a;N;$!ba;s/\n/,/g' email.txt

这是我从上述命令中获得的文件的输出

contact@email.com,John.Doe@test.com,Smith@hello.co.uk, orange123@testing.com,Some_Email@gmail.com,support@email.com, contact@email.com,Testing@outlook.com

使用tr应该也可以

tr '\n' ',' < email.txt > csv.out
相关问题