나는 철자법에 대한 몇 가지 사전을 가지고 있습니다 file.dic
. 예를 들어:
abc
aword
bword
cab
worda
wordzzz
다른 단어를 찾고 있어요편곡(또는 철자 바꾸기)서로.
"알파벳순으로 정렬"하라는 명령이 있다면 다음과 같이 할 것입니다.
cat file.dic | letter-sort | paste - file.dic | sort
이것은 나에게 다음을 제공합니다:
abc abc
abc cab
adorw aword
adorw worda
bdorw bword
dorwzzz wordzzz
이제 파일에 철자 바꾸기가 명확하게 표시됩니다. 그러한 명령이 있거나 letters-sort
그렇지 않으면 그러한 결과를 얻는 방법이 있습니까?
답변1
파일에서 문자를 한 줄씩 정렬하려면 다음을 수행할 수 있습니다.
while read line; do
grep -o . <<< "${line}" | sort | tr -d '\n'
echo
done < file.dic
산출:
abc
adorw
bdorw
abc
adorw
dorwzzz
답변2
이 fold
명령을 사용하면 아래 스크립트와 같이 문자열을 개별 문자 배열로 나눌 수 있습니다.
#!/bin/bash
CHARS=`echo $1 | fold -w1`
# $CHARS now contain an array of single character in the string $1
for i in "${CHARS[@]}"
do
# do something with each character
echo $i;
done
위의 스크립트를 저장했다고 가정하면 test.sh
다음과 같이 실행할 수 있습니다.
$./test.sh abcde
문자열 "abcde"를 문자 배열로 분리한 다음 이를 사용하여 철자 바꾸기를 찾을 수 있습니다.
답변3
당신이 언급한 것을 python
그대로 유지하세요 python
. 1. 동일한 문자를 포함하고 2. 문자 빈도가 일치하는 경우 두 단어는 서로의 철자 바꾸기입니다. 내장 Counter
클래스를 사용하면 정렬 없이 일회성 문자 빈도를 수행할 수 있습니다.
from __future__ import print_function
from collections import Counter, defaultdict
from itertools import combinations_with_replacement
with open('file') as f:
data = (l.rstrip('\n') for l in f)
data = ((l, Counter(l)) for l in data)
perms = defaultdict(list)
for l, c in data:
perms[frozenset(c.iteritems())].append(l)
for anagrams in perms.itervalues():
print(*anagrams)
bword
aword worda
abc cab
wordzzz
답변4
Perl과 해당 명령줄 플래그는 간결성이 뛰어납니다.
다음 명령은 단어의 문자를 정렬합니다.
perl -CS -ne 'chomp; print(join("", sort(split("", $_ . "\n"))))'
실제로, 단어 퍼즐 작업을 하고 있다면 이 an
유틸리티를 사용하는 것이 더 나을 수도 있습니다. 이는 사전을 인수로 사용할 수 있습니다.
an -d /usr/share/dict/ngerman Anagramword