行ごとにコンマで区切られた特定のフィールドから重複した項目を削除します。

行ごとにコンマで区切られた特定のフィールドから重複した項目を削除します。

だから私のファイル形式は、タブで区切られた列、列あたりcsvです。

        1 B,B,B,B  C,C,C,C  D,D,D,D

        2 A,A,A,A  B,B,B,B  E,E,E,E

各ファイルから重複項目を削除したいが、各重複項目行は独立して処理される1行ずつ処理されます。

したがって、出力は次のようになります

1 B C D
2 A B E 

答え1

Perlでdistinct(別名)を使用するuniqリスト::追加ユーティリティ基準寸法

perl -MList::MoreUtils=distinct -alne '
  print join " ", map { join ",", distinct split "," } @F
' yourfile
1 B C D

2 A B E

タブ区切りの出力が必要な場合は、最初の出力をjoin " "次に変更します。join "\t"

答え2

sed -Ee 's/([^,\t]*,?)+/\1/g' yourfile

ここではGNU sedを使用します。

1       B       C       D
2       A       B       E

答え3

Pythonソリューション(Python 3.5でテスト済み):

del_duplicates.pyスクリプト:

import sys
with open(sys.argv[1], 'r') as f:      # reading the file (passed in via command line)
    lines = f.read().splitlines()      # split the file into list of lines
    for l in lines:                    # for each line
        items = l.split('\t')          # split line by tab `\t`
        for k,i in enumerate(items):   # processing fields
            if k > 0: items[k] = ','.join(set(i.split(',')))  # getting unique values via set object
        print('\t'.join(items))        # join separate fields back into straight line

使用法:

python del_duplicates.py yourfile

出力:

1   B   C   D
2   A   B   E

答え4

(主に)bashの使用:

入力ファイル(非同期フィールドに何が起こるかを確認するには、行を追加します。

1   B,B,B,B C,C,C,C D,D,D,D
2   A,A,A,A B,B,B,B E,E,E,E
3   L,M,M   N,O,N   X,Y,Z

区切り文字で区切られた単語から重複した単語を削除する機能。関数本体に括弧を使用して、変更を$IFSサブシェルに分割しました。引用符がないというのが$2ここの魔法です。

uniqify() (
    IFS=$1
    printf "%s\n" $2 | sort -u | paste -sd"$1"
)

ファイルを処理します。

while read -ra words; do 
    for word in "${words[@]}"; do 
        uniqify , "$word"
    done | paste -s
done < input

出力

1   B   C   D
2   A   B   E
3   L,M N,O X,Y,Z

関連情報