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

Хорошо, первый пост..

Итак, у меня есть это задание расшифровать криптограммы вручную, но я также хотел немного автоматизировать процесс, если не все, по крайней мере несколько частей, поэтому я просмотрел и нашел несколько вкладышей sed и awk one, чтобы сделать некоторые вещи, которые я хотел сделать, но не все, что я хотел/нужно.

Есть несколько веб-сайтов, которые делают то, что я хочу, но я действительно хочу просто сделать это в bash по какой-то причине, просто потому, что хочу лучше понять это и тому подобное :)

Сценарий будет принимать имя файла в качестве параметра и выводить другой файл, например solution$1, когда закончит.

if [ -e "$PWD/$1" ]; then
 echo "$1 exists"
else
  echo "$1 doesnt exists"   
fi

Запустит скрипт, чтобы увидеть, существует ли файл в параметре.

Затем я нашел этот лайнер

sed -e "s/./\0\n/g" $1 | while read c;do echo -n "$c"  ; done

Что отлично работает, но мне нужно было бы иметь количество вхождений на букву, я действительно не понимаю, как это сделать.

Вот чего я пытаюсь достичь более или менее http://25yearsofprogramming.com/fun/ciphers.htm для подсчета уникальных вхождений букв и тому подобного.

Затем мне нужно поместить все буквы в нижний регистр.

После этого я вижу, как скрипт делает следующие вещи.. -индекс, который сканирует файл словаря на наличие определенного шаблона и размера слов, чем больше слова, тем лучше. Например: скажем, решение — это слово «одежда», а зашифрованное слово — «zxxzgvk». Существует ли способ регулярного выражения для выражения шаблона, который сравнивает эти два слова и перечисляет слово «одежда» в файле словаря, потому что «аппа» и "zxxz" - похожие шаблоны, а "zxxzgvk" имеет одинаковую длину с "одеждой".

  1. Можно ли это сделать частично, и реально ли рассматривать проблему таким образом, или это просто надумано?

    • Another subscript who takes the found letters from the previous output word and that swap letters in the cryptogram.

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

Затем мне нужно будет выяснить, как приступить к повторному сканированию новых найденных слов, чтобы увидеть, частично или полностью они найдены в файле словаря, а затем поменять местами больше букв или нет.

  1. Кто-нибудь видел эту проблему в прошлом и пытался решить ее с помощью шаблонов словами, как я это описал, или это слишком сложно?

  2. Должен ли я регистрировать какие-либо свопы?

Может быть, просто просмотрите все зашифрованные слова и поменяйте местами по мере продвижения, а затем выполните еще одну проверку с ограничением for в первой проверке, чтобы не менять буквы в верхнем регистре (на самом деле, чтобы использовать их как более точные шаблоны ..!)

Кто-нибудь делал подобный скрипт/программу на другом языке? Если да, то какой? Может быть, я могу как-то относиться :)

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

Я с радостью включу криптограммы, которые я расшифровал, и ту, которую мне еще предстоит расшифровать :)

Опять же, цель моего задания не в том, чтобы сделать этот скрипт, а просто в том, чтобы разрешить криптограммы. Но создание сценариев или, по крайней мере, попытка увидеть, как я буду делать этот сценарий, помогает мне немного лучше понять, как думать в терминах кода. Не стесняйтесь указывать мне в правильном направлении!

Сама криптограмма основана на простой алфавитной замене.

Я сделал здесь pastebin с кодом, который будет :) http://pastebin.com/UEQDsbPk

В псевдокоде, как я это вижу:

  • вызов программы с именем входного файла в параметре и, необязательно, вторым именем файла (словарь)
  • убедитесь, что входной файл существует и не пуст
  • прочитать содержимое файла и вывести его на экран
  • преобразовать в нижний регистр
  • просканируйте текст и подсчитайте количество каждой буквы, чтобы провести частотный анализ
  • спросить пользователя, на каком языке должен быть текст (английский по умолчанию)
  • используйте ответ, чтобы указать, какие частоты букв использовать в качестве базовой линии
  • поменять местами буквы, соответствующие частотному анализу, в верхнем регистре.
  • распечатать измененный документ на экране
  • попросить пользователя поменять местами буквы в зашифрованном тексте
  • если пользователь указал файл словаря в качестве второго аргумента
  • затем просканируйте шифр на наличие слов и найдите более крупные слова
  • найти слова с похожим рисунком (некоторые буквы повторяются) в файле словаря
  • вывести на экран результаты, если таковые имеются
  • предложить поменять местами буквы, соответствующие в шифре
  • вывести измененный шифр на экран
  • попросите еще раз поменять местами буквы или найти больше похожих слов

Примерно так я вижу структуру сценария.

  1. Вы видите что-нибудь, что я должен добавить, я что-то пропустил?

Я надеюсь, что эта исправленная версия станет более понятной для всех!


person marc-andre benoit    schedule 15.02.2011    source источник
comment
Я думаю, вам действительно следует подумать об использовании языка, который больше подходит для этой цели. Также пожалуйста отредактируйте свое сообщение, чтобы оно содержало актуальный вопрос   -  person Kimvais    schedule 15.02.2011
comment
я нашел это... но я не могу заставить код работать... :( stackoverflow.com/questions/3802685/   -  person marc-andre benoit    schedule 15.02.2011
comment
я только что пересмотрел свой пост, чтобы он был более подходящим, пожалуйста, скажите мне, лучше это или хуже :)   -  person marc-andre benoit    schedule 15.02.2011
comment
Это хорошо. Но в чем конкретная проблема сейчас? Это можно сделать в POSIX.2, хорошо, но этот сайт для... менее глобальных вопросов :)   -  person    schedule 15.02.2011
comment
Пожалуйста, сократите свой вопрос. Это просто большая стена слов.   -  person Dennis Williamson    schedule 15.02.2011


Ответы (2)


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

Если бы вы могли изложить это в псевдокоде, было бы проще. В Unix есть все виды текстового манипулирования. Средства для использования зависят от того, насколько велики ваши тексты. Я считаю, что они не такие большие, иначе вы бы использовали какой-нибудь скомпилированный язык.

Например, простой, но дорогостоящий способ подсчета частот:

awk -F "" '{for(i=1;i<=NF;i++) freq[$i]++;}END{for(i in freq) printf("%c %d\n", i, freq[i]);}'

Что касается транслитерации, то есть tr утилита. Вы можете подделать, а затем передать ему фактические строки в каждом случае (это справедливо для шифров, подобных Цезарю).

person Community    schedule 15.02.2011
comment
я вижу сообщение, в котором задаются похожие вопросы. я улучшаю взлом шифров подстановки программно"> stackoverflow.com/questions/2291110/ - person marc-andre benoit; 15.02.2011

grep -o . inputfile | sort | uniq -c | sort -rn

Пример:

$ echo 'aAAbbbBBBB123AB' | grep -o . | sort | uniq -c | sort -rn
  5 B
  3 b
  3 A
  1 a
  1 3
  1 2
  1 1
person Dennis Williamson    schedule 15.02.2011
comment
Я думаю, что можно также использовать fold -w1. Сделал бы то же самое, но переносное. - person ; 15.02.2011