목록에서 철자 바꾸기 중복을 제거하는 방법은 무엇입니까?

목록에서 철자 바꾸기 중복을 제거하는 방법은 무엇입니까?

문자열과 설명이 포함된 탭으로 구분된 .csv가 있습니다. 이 같은:

strap   tight
elba    Island
foo     bar
able    Cain
parts   buy
able    Cain

먼저 탭 앞의 모든 항목의 길이를 기준으로 파일을 정렬합니다.

parts   buy
strap   tight
able    Cain
able    Cain
elba    Island
few     many

그런 다음 정확히 동일한 중복 항목을 제거합니다.

parts   buy
strap   tight
able    Cain
elba    Island
few     many

그래도 삭제해야 해요단어 퍼즐중복—부분그리고줄자같은 글자를 가지고 있어요. 너무 너무엘바그리고유능한.

parts   buy
able    Cain
few     many

대화 상자 경고를 에코합니다. 다음과 같습니다.

거짓말쟁이를 찾아내다


이 작업을 수행하는 최선의 방법에 대한 아이디어가 있습니까?

편집하다:

아래에 몇 가지 답변이 있습니다:

  • 이는 Mac OS용입니다.
  • 나는 1달러짜리 경기에만 관심이 있어요
  • $1에는 대문자가 없습니다(그러나 $2에는 대문자가 있습니다).
  • $1에는 중복된 문자가 없습니다.

이것은 내가 지금 사용하고 있는 코드입니다:

  # print length+iii before every line
  awk '{printf "%diii%s\n", length($1), $0}' < file.txt > /tmp/out && mv /tmp/out file.txt

  # remove exact duplicates
  sort -u < file.txt > /tmp/out && mv /tmp/out file.txt

  # remove non-identical duplicates
  # awk '{magic}' < file.txt > /tmp/out && mv /tmp/out file.txt
  # varDupeEcho=remainder from above

  # sort by size
  sort -n -r -k1,1 < file.txt > /tmp/out && mv /tmp/out file.txt

  #remove lengths
  sed -i "" -E -e 's/^[0-9]+iii//' file.txt

  # warn about duplicates
  osascript -e "display dialog \"Duplicates found!\n\n$varDupeEcho\" --> Result: \{button returned:\"OK\"\}"

답변1

어떤 순서로든 값을 비교하는 일반적인 방법은 부분을 정렬하여 비교용 키를 만드는 것입니다. 예를 들어 "sorted_in"에 대해 GNU awk를 사용하고 문자열을 문자로 분할()하려면 null 세 번째 인수를 사용합니다.

$ cat tst.awk
BEGIN {
    PROCINFO["sorted_in"] = "@val_str_asc"
    OFS = "\t"
}
{
    key = ""
    split($1,chars,"")
    for (i in chars) {
        key = key tolower(chars[i])
    }
    print key, $0
}

$ awk -f tst.awk file | sort -k1,1 -u | cut -f2-
elba    Island
strap   tight
foo     bar

명확한 그림을 얻기 위해 한 번에 한 단계씩 수행 중인 작업을 볼 수 있습니다.

$ awk -f tst.awk file
aprst   strap   tight
abel    elba    Island
foo     foo     bar
abel    able    Cain
aprst   parts   buy
abel    able    Cain

$ awk -f tst.awk file | sort -k1,1
abel    able    Cain
abel    able    Cain
abel    elba    Island
aprst   parts   buy
aprst   strap   tight
foo     foo     bar

$ awk -f tst.awk file | sort -k1,1 -u
abel    elba    Island
aprst   strap   tight
foo     foo     bar

귀하의 질문에 귀하가 MacOS를 사용하고 있음을 나타내는 설명을 추가하신 것을 확인했습니다. 좋아요, 거기에 GNU awk를 설치하시면 됩니다. 다른 awk를 사용하여 위의 작업을 수행할 수 있지만 각 입력 라인의 주요 문자에 대해 Unix 정렬을 호출하기 위해 쉘을 생성해야 합니다. 이는 값이 매우 느리고 쓰기가 약간 번거롭습니다. 정렬 알고리즘을 직접 구현해야 하고 작성하기가 힘들며 gawk를 빠르고 쉽게 설치할 수 있고 이 문제와 향후 문제를 해결할 수 있다면 그 모든 것은 가치가 없습니다.

관련 정보