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

ここでレコードは '|' です。1 列目に、「,」で区切られた 2 つの電子メール 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

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

次の 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

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

This seems to work, although I'm not sure what to do if there are more than three unique mails. Run with 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
}

There's also this "one-liner" that doesn't need 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 -lane '$s{$_}++ for split /[|,]/; END { print for keys %s;}' input
于 2012-09-10T10:12:35.520 に答える
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 に答える