如何在unix中找到不同的值

时间:2012-09-10 04:41:39

标签: unix sed awk

我需要以下列中的不同值:

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

4 个答案:

答案 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