Bash 문자열에 포함된 고유 단어를 표시하는 방법은 무엇입니까? [폐쇄]

Bash 문자열에 포함된 고유 단어를 표시하는 방법은 무엇입니까? [폐쇄]

워드 파일의 내용:

a-b-c
c-b-a
c-a-b
d-a-x‬

나는 단지 출력을 원합니다 :

a-b-c
d-a-x

다음과 같은 이유 때문에:

c-b-a  
c-a-b 

이러한 조합은 다음에서 비롯됩니다.a-b-c

답변1

다음은 Perl 솔루션입니다. awk에서의 구현은 연습으로 남겨집니다.

$ perl -F'-' -lnE 'say $_ unless $seen{join "-", sort @F}++' file
a-b-c
d-a-x‬

-요소가 모두 단일 문자인 경우 구분 기호를 다시 삽입할 필요는 없지만 다른 경우에는 구분 기호가 중요해집니다( ab-c예: 차별화 a-bc).

답변2

귀하의 단어가 실제로 대시로 구분된 간단한 문자열이라고 가정하면 다음을 사용할 수 있습니다.슈워츠 변환이와 같이

#!/bin/bash
# Assumes words are in /tmp/words

while IFS= read line
do
    sorted=$(printf "%s\n" "$line" | tr - '\n' | LC_ALL=C sort | tr '\n' -)
    # printf "sorted= >%s<, line= >%s<\n" "$sorted" "$line" >&2
    printf "%s\t%s\n" "$line" "$sorted"
done < /tmp/words |
    sort -t $'\t' -uk2,3 |
    cut -f1

대시 사이의 "단어"는 분리되어 영숫자순으로 정렬된 다음 다시 결합됩니다. ( printf정렬된 행을 보려면 중간 부분의 주석 처리를 제거하십시오.) 이는 sort고유성 제약 조건이 있는 정렬 키로 사용되므로 중복 키가 포함된 행은 삭제됩니다. 부작용은 원래 순서가 변경된다는 것입니다. 이것이 허용되지 않는 경우 질문에서 이를 새로운 요구 사항으로 선언해야 합니다. 그런 다음 정렬 키를 버리고 원본 데이터를 출력합니다.

질문에 제공된 데이터의 샘플 출력

a-b-c
d-a-x‬

지침

  1. 데이터가 대시로 구분된 "단어"라고 가정합니다.
  2. 데이터에 이상한 문자(탭, 줄 바꿈)가 포함되어 있지 않다고 가정합니다.

관련 정보