对单个单词中的字母进行排序 - 用它来查找排列(或字谜)

对单个单词中的字母进行排序 - 用它来查找排列(或字谜)

我有一些字典可以拼写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

相关内容