예를 들어 in은 a:bc:d:a:hi:p:a
중복 항목을 제거 a
하고 in apple:orange:apple:.:pear:mango:.:apple
-는 중복 항목을 제거합니다.apple
답변1
암소 비슷한 일종의 영양앗해결 방법(모든 구분 기호가 유지됨):
s="apple:orange:apple:.:pear:mango:.:apple"
awk '{ len=split($0,a,/:|:\.:/,seps);
for(i=1;i<=len;i++) printf "%s%s",(!w[a[i]]++? a[i]:""),(i==len? "":seps[i]);
print "" }' <<<"$s"
len=split($0,a,/:|:\.:/,seps)
- 문자열을 정규식 패턴으로 구분된 조각으로 분할/:|:\.:/
하고 조각을 배열에 저장a
하고 구분 기호 문자열을seps
배열에 저장합니다.len
- 분할로 인해 생성된 요소/블록의 개수를 포함합니다.
산출:
apple:orange::.:pear:mango:.:
답변2
Python 솔루션 주문
순서가 중요한 경우 Python의 한 줄의 코드로 다음을 수행할 수 있습니다.
$ python -c 'import sys;from collections import OrderedDict; d=OrderedDict( (i,True) for i in sys.argv[1].split(":") );print ":".join(d.keys())' 'apple:orange:apple:.:pear:mango:.:apple'
apple:orange:.:pear:mango
약간 길기 때문에 작은 스크립트로 작성할 수 있습니다.
#!/usr/bin/env python
from collections import OrderedDict
import sys
d=OrderedDict( (i,True) for i in sys.argv[1].split(":") )
print ":".join(d.keys())
다음과 같이 사용하십시오.
$ ./uniq_tokens.py 'apple:orange:apple:.:pear:mango:.:apple'
apple:orange:.:pear:mango
작동 방식:
- 처리하려는 문자열을 명령줄 인수로 제공하므로
sys
모듈을 사용하여 참조합니다.sys.argv[1]
sys.argv[1]
:
구분 기호를 사용하여 토큰으로 분할(i,True) for i in sys.argv[1].split(":")
두 개의 값이 있는 튜플 목록을 만들 수 있습니다. 여기서는True
더미 값만 있습니다.OrderedDict
그런 다음 이를 가져와 키 값 쌍의 사전을 만듭니다. 이것은 그것을 만드는 "저렴한" 방법이다주문한 세트그리고목록 이해사전 이해의 대안으로. 문자열이 이미 키로 존재하는 경우 고유한 상태로 유지됩니다(불필요한 일을 하지 않는 이상)":".join()
우리가 분할한 모든 토큰을 가져온 다음(d.keys()
여기서 사용함) 이를 다시 멋진 전체 문자열로 변환하고 사용할 수 있습니다.:
- 인쇄는 자명합니다.
순서가 없지만 더 짧은 Python 솔루션
순서가 중요하지 않은 경우 더 짧은 솔루션을 얻을 수 있습니다(그러나 이는 실제 적용보다 재미를 위한 것입니다. 아마도 99%의 시간 동안 토큰 순서를 유지하려고 할 것입니다).
$ python -c 'import sys;print ":".join(set(sys.argv[1].split(":")))' 'a:bc:d:a:hi:p:a'
a:p:hi:d:bc
작동 방식은 간단합니다.
- 필요한 문자열을 명령줄 인수로 전달하므로
import sys
첫 번째 명령줄 인수를 다음과 같이 인용 해야 합니다.sys.argv[1]
- 이제 두 번째 부분을 열어 보겠습니다.
sys.argv[1].split(":")
처음에는 전체 문자열인 토큰 목록이 제공되며, 이를:
개별 토큰의 구분 기호 로 사용합니다. set()
위에서 언급한 문자열 목록을 가져와서 고유한 값을 제공합니다.- 이제 이 문자열 모음을 다시 완전한 문자열로 변환해야 합니다. 이것이 바로 구분 기호를 사용하여
":".join()
모든 토큰을 다시 연결하는 이유입니다.:
print
자명하다. 이는 Python 2.7 구문입니다.print()
파이썬 3 의 경우
다음은 다른 문자열을 사용한 테스트입니다.
$ python -c 'import sys;print ":".join(set(sys.argv[1].split(":")))' 'apple:orange:apple:.:pear:mango:.:apple'
orange:mango:pear:apple:.
답변3
Perl의 해시 데이터 유형을 사용하여 중복을 제거할 수 있습니다.
$ cat ./remove_dup.pl
#!/usr/bin/perl -w
use strict;
my $input = shift;
my %seen;
my $order=1;
foreach my $dir ( split /:/, $input ) {
$seen{$dir} = $order++ unless ($seen{$dir}) ;
}
my $output = join( ':', sort { $seen{$a} <=> $seen{$b} } keys(%seen));
print $output . "\n";
데모:
$ ./remove_dup.pl a:bc:d:a:hi:p:a
a:bc:d:hi:p
$ ./remove_dup.pl apple:orange:apple:.:pear:mango:.:apple
apple:orange:.:pear:mango
답변4
일방 bash
통행:
strjoin() { local IFS="$1"; echo "${*:2}"; }
dedup() {
declare -A valbag
IFS=: read -r -a vals <<<"$1"
for ((i=0; i < ${#vals[@]}; i++)); do
(( valbag[${vals[i]}]++ > 0 )) && vals[i]=''
done
strjoin : "${vals[@]}"
}
$ dedup apple:orange:apple:.:pear:mango:.:apple
apple:orange::.:pear:mango::
$ dedup 'a:bc:d:a:hi:p:a'
a:bc:d::hi:p:
이는 모든 콜론을 제자리에 유지하고 콜론 사이의 중복 항목만 지우라는 귀하의 의견 요구 사항을 충족합니다.