행당 쉼표로 구분된 특정 필드에서 중복된 항목을 제거합니다.

행당 쉼표로 구분된 특정 필드에서 중복된 항목을 제거합니다.

그래서 내 파일 형식은 탭으로 구분된 열, 열당 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 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 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

관련 정보