1

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

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

这里的记录是'|' 分隔,在第一列中,我们可以使用两个电子邮件 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

7 回答 7

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
于 2012-09-10T07:44:58.673 回答
1

以下python代码将解决您的问题:

#!/usr/bin/env python
while True:
    try:
        addrs = raw_input()
    except EOFError:
        break
    print '|'.join(set(addrs.replace(',', '|').split('|')))
于 2012-09-10T06:28:31.237 回答
1

仅在 Bash 中:

while read s; do
  IFS='|,'
  for e in $s; do
    echo "$e"
  done | sort | uniq
  unset IFS
done
于 2012-09-10T08:21:25.260 回答
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|
于 2012-09-10T14:29:54.317 回答
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

猫 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

您可以减去所有“,”分隔的值并以相同的方式解析......如果您的所有值都有“,”分隔。

于 2012-09-10T07:26:52.080 回答
0

这似乎可行,尽管我不确定如果有超过三个独特的邮件该怎么办。运行awk -f filename.awk dataname.dat

BEGIN {IFS=/[,|]/}

NF { 
    delete uniqmails; 
    for (i=1; i<=NF; i++) 
        uniqmails[$i] = 1;
    sep="";
    n=0;
    for (m in uniqmails) {
        printf "%s%s", sep, m;
        sep="|";
        n++;
    }
    for (;n<3;n++) printf "|";
    print ""; // EOL
}

还有一个不需要 awk 的“单线”:

while read line; do 
    echo $line | tr ",|" "\n"  | sort -u |\
    paste <( seq 3) - | cut -f 2 |\
    tr "\n" "|" |\
    rev | cut -c 2- | rev; 
done
于 2012-09-10T07:56:18.227 回答
0

使用 perl:

perl -lane '$s{$_}++ for split /[|,]/; END { print for keys %s;}' input
于 2012-09-10T10:12:35.520 回答