我需要以下列中的不同值:
AA|BB|CC
a@gmail.com,c@yahoo.co.in|a@gmail.com|a@gmail.com
y@gmail.com|x@yahoo.in,z@redhat.com|z@redhat.com
c@gmail.com|b@yahoo.co.in|c@uix.xo.in
这里的记录是'|'分开,在第1栏,我们可以分开两个电子邮件ID','分开。所以,我也想考虑一下。我希望在AA,BB,CC列中有不同的电子邮件ID,无论是'|'分开或','分开。
预期产出:
c@yahoo.co.in|a@gmail.com|
y@gmail.com|x@yahoo.in|z@redhat.com
c@gmail.com|b@yahoo.co.in|c@uix.xo.in
答案 0 :(得分:3)
awk unix足够吗?
{
for(i=1; i < NF; i++) {
if ($i ~ /@/) {
mail[$i]++
}
}
}
END {
for (x in mail) {
print mail[x], x
}
}
输出:
$ awk -F'[|,]' -f v.awk f1
2 z@redhat.com
3 a@gmail.com
1 x@yahoo.in
1 c@yahoo.co.in
1 c@gmail.com
1 y@gmail.com
1 b@yahoo.co.in
答案 1 :(得分:1)
使用awk:
cat file | tr ',' '|' | awk -F '|' '{ line=""; for (i=1; i<=NF; i++) {if ($i != "" && list[NR"@"$i] != 1){line=line $i "|"}; list[NR"@"$i]=1 }; print line}'
打印:
a@gmail.com|c@yahoo.co.in|
y@gmail.com|x@yahoo.in|z@redhat.com|
c@gmail.com|b@yahoo.co.in|c@uix.xo.in|
修改: 现在可以使用以下输入正常工作:
a@gmail.com|c@yahoo.co.in|
y@gmail.com|x@yahoo.in|a@gmail.com|
c@gmail.com|c@yahoo.co.in|c@uix.xo.in|
打印:
a@gmail.com|c@yahoo.co.in|
y@gmail.com|x@yahoo.in|a@gmail.com|
c@gmail.com|c@yahoo.co.in|c@uix.xo.in|
答案 2 :(得分:0)
我已经编辑了这篇文章,希望它会起作用
while read line
do
val1=`echo $line|awk -F"|" '{print $1}'`
val2=`echo $line|awk -F"|" '{print $2}'`
val3=`echo $line|awk -F"|" '{print $3}'`
a=`echo $line|awk -F"|" '{print $2,"|",$3}'|sed 's/'$val1'//g'`
aa=`echo "$val1|$a"`
b=`echo $aa|awk -F"|" '{print $1,"|",$3}'|sed 's/'$val2'//g'`
b1=`echo $b|awk -F"|" '{print $1}'`
b2=`echo $b|awk -F"|" '{print $2}'`
bb=`echo "$b1|$val2|$b2"`
c=`echo $bb|awk -F"|" '{print $1,"|",$2}'|sed 's/'$val3'//g'`
cc=`echo "$c|$val3"|sed 's/,,/,/;s/,|/|/;s/|,/|/;s/^,//;s/ //g'`
echo "$cc">>abcd
done<ab.dat
cat abcd
c@yahoo.co.in||a@gmail.com
y@gmail.com|x@yahoo.in|z@redhat.com
c@gmail.com|b@yahoo.co.in|c@uix.xo.in
你可以减去所有“,”分隔的值并以相同的方式解析...如果你的所有值都是“,”分开。
答案 3 :(得分:0)
使用perl:
perl -lane '$s{$_}++ for split /[|,]/; END { print for keys %s;}' input