単一単語の文字ソート - 順列(またはスペル置換)を見つけるために使用します。

単一単語の文字ソート - 順列(またはスペル置換)を見つけるために使用します。

私はスペルのためのいくつかの辞書があります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

ファイル内の文字を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. 文字の頻度が一致する場合、2 つの単語は互いのスペルを置き換えます。組み込みCounterクラスを使用すると、ソートせずに1回の文字頻度を実行できます。

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

関連情報