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