フィールドから重複値を削除する

フィールドから重複値を削除する

コピーを1つだけ保持しながら、ファイルの選択したフィールド内で重複(または複数)の値を削除するにはどうすればよいですか?

はい

入力ファイル:

A    1,2,3,45,1,8,2,3
B    5,6,6,6,6,6,2,3,7

予想出力:

A    1,2,3,45,8
B    5,6,2,3,7

答え1

一つずつsed:

sed '
  s/[^[:blank:]]\{1,\}/,&,/g;:1
  s/\(\(,[^,[:blank:]]*\)\(,[^,[:blank:]]*\)*\)\2,/\1,/;t1
  s/,\([^[:blank:]]*\),/\1/g'

(文字を含むすべてのフィールドを処理,し、間隔を維持します)

答え2

そしてperl

perl -MList::MoreUtils=uniq -pe 's{\S*,\S*}{join ",", uniq split ",", $&}ge'

(文字を含むすべてのフィールドを処理,し、間隔を維持します)

答え3

別のperl解決策:

perl -anle '                                                                    
    print "$F[0] ", join ",", grep {!$seen{$_}++} split ",",$F[1];              
    %seen=();                                                                   
' file
A 1,2,3,45,8
B 5,6,2,3,7

答え4

awk '{n=split($2, a, ","); $2=a[1];
  for(i=2; i<=n; i++)
    {$2 = ($2 ~ "(^|,)" a[i] "($|,)") ? $2 : ($2 "," a[i])}}1' OFS='\t' file

関連情報