сортировка букв в одном слове - использование для поиска перестановок (или анаграмм)

Мне нравится использовать вставьте команду .

paste -d. file1 - - file2 < /dev/null

производит желаемый результат

file1_a...file2_a
file1_b...file2_b
file1_c...file2_c
file1_d...file2_d  

- относится к стандартному вводу, мы используем его дважды, чтобы утроить наши точки используется, потому что нам не нужно ничего между этими точками.

3
18.11.2016, 01:50
4 ответа

Чтобы отсортировать буквы в файле построчно, вы можете сделать что-то вроде этого:

while read line; do
    grep -o . <<< "${line}" | sort | tr -d '\n'
    echo
done < file.dic

Вывод:

abc
adorw
bdorw
abc
adorw
dorwzzz
1
27.01.2020, 21:22

Вы можете использовать команду 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» в массив символов, который затем можно использовать для поиска ее анаграмм.

1
27.01.2020, 21:22

Вы упомянули 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
1
27.01.2020, 21:22

Perl с его флагами командной строки может быть очень лаконичным:

Следующая команда сортирует буквы в слове

perl -CS -ne 'chomp; print(join("", sort(split("", $_. "\n"))))' 

На практике, если вы работаете с анаграммами, вы можете предпочесть использовать утилиту an. Это может принимать словарь в качестве аргумента:

an -d /usr/share/dict/ngerman Anagramword
0
27.01.2020, 21:22

Теги

Похожие вопросы