2016-12-08 21 views
2

Итак, у меня есть список слов, содержащий более 30 000 слов. Мои цели заключаются в том, чтобы сделать скрипт, который принимает слово без констант в нем (например: mbnt), и каким-то образом добавлять константы и сравнивать со списком слов, чтобы найти по крайней мере слово «ambient», хотя оно также найдет другие слова, которые читайте как «mbnt», если вы должны вынуть все свои гласные. До сих пор это мой Баш скриптИтерировать пользовательскую строку в bash, чтобы добавить гласные в строку

f=/wordList 
anyVowel=[aAeEiIoOuU] 
nonVowel=[^aAeEiIoOuU] 
input=$1 
for ((i=0; i<${#input}; i++)); 
do 
grep "${input:$i:1}$nonVowel" $f | head -10 
done 

однако это будет просто возвращать только нормальный список слов с некоторыми из символов вводимых пользователем. Любые мысли о том, что я могу делать неправильно?

+1

Для начала, вы пытаетесь сделать обработку данных в 'bash'. – chepner

+0

Одна вещь, которая идет не так, состоит в том, что входные символы ищутся по одному за раз. Их нужно искать для всех вместе, в правильном порядке. Кроме того, их нужно смешивать с гласными, а не с гласными. Возможно, имеет смысл смешивать их с несогласованными, если в списке слов есть пунктуация. Тогда 'don't' будет соответствовать для' dnt'. – pjh

ответ

2

awk на помощь!

$ awk -v w=whr '{a=tolower($0); 
       gsub(/[^a-z]/,"",a); 
       gsub(/[aeiou]/,"",a)} 
       a==w' words 

where 

ищет гласные, сброшенные слова «whr» в словах (составляют пользовательский dict). Преобразуйте в нижний регистр, отфильтруйте не альфа и удалите гласные, наконец, найдите совпадение с данным словом.

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

0

Попробуйте

wordsfile=wordList 
consonants=$1 

# Create a regular expression that matches the input consonants with 
# any number of vowels before, after, or between them 
regex='^[[:space:]]*[aeiou]*' 
for ((i=0; i<${#consonants}; i++)) ; do 
    regex+="${consonants:i:1}[aeiou]*" 
done 
regex+='[[:space:]]*$' 

grep -i -- "$regex" "$wordsfile"