Как найти частоту случаев строк содержавшейся в файле?

Большинство инструментов Unix разработано для работы хорошо с текстовыми файлами. Текстовый файл состоит из последовательности строк. Строка состоит из последовательности печатаемых символов, заканчивающихся символом новой строки. В частности, последний знак непустого текстового файла всегда является символом новой строки. Очевидно, example.txt содержит только some text без заключительной новой строки, таким образом, это не текстовый файл.

cat делает простое задание; превращение произвольных файлов в текстовые файлы не является частью того задания. Некоторые другие инструменты всегда превращают свой вход в текстовые файлы; если Вы не уверены файл, Вы отображаете концы с новой строкой, пытаетесь работать awk 1 вместо cat.

Можно заставить удар отобразить свою подсказку на следующей строке, если предыдущая команда оставила курсор где-нибудь кроме последнего поля. Вставьте это Ваш .bashrc (изменение GetFree предложения Dennis Williamson):

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

4
30.10.2013, 12:37
2 ответа

Исходный входной файл

Принятие следующего формата ввода:

http://www.google.com,

www.google.com,

google.com

yahoo.com

С результатом, бывшим похожим на это:

google.com : 3 
yahoo.com : 1 

Трудно определить всю ситуацию, в которой Вы находитесь, но, учитывая вывод Вы показываете нам, я был бы склонен преобразовать входной файл сначала так, чтобы все строки имели форму:

google.com
google.com
google.com
yahoo.com

И затем петляйте через следующий набор команд:

$ grep -v "^$" data.txt | \
      sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
      sort | uniq -c
      3 google.com
      1 yahoo.com

Можно очистить формат вывода, таким образом, он соответствует тому, что Вы хотите как это:

$ grep -v "^$" data.txt | \
      sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
      sort | uniq -c | \
      awk '{printf "%s : %s\n", $1, $2}'
      google.com : 3
      yahoo.com : 1

РЕДАКТИРОВАНИЕ № 1

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

http://www.google.com/absd/siidfs/kfd837382$%^$&,

www.google.com,

google.com

yahoo.com/list/page/jhfjkshdjf...

Вы могли использовать эту адаптированную остроту от первого примера:

$ grep -v "^$" data2.txt | \
      sed -e 's/,$//' \
          -e 's#\(http://[^/]\+\).*#\1#' \
          -e '/^[^http]/ s/^www\.//' \
          -e '/^[^http]/ s#\([^/]\+\).*$#\1#' | \
          sort | uniq -c | \
          awk '{printf "%s : %s\n", $1, $2}'
2 : google.com
1 : http://www.google.com
1 : yahoo.com
8
27.01.2020, 20:47
  • 1
    , что сделать, если у меня есть более длинные URL, как спросили в отредактированном вопросе? –  coder 30.10.2013, 12:38
  • 2
    @coder - вероятно, необходимо было попросить что как другой вопрос. Этого спросили и ответили, Вы повреждаете все ответы здесь и делаете большую работу уборки для всех. В 2-м Q можно сослаться на этого и сказать, что необходимо развернуть решение. Спросите это как 2-й вопрос и откатывайте редактирования на этом так, чтобы это было, как это было прежде. Я могу помочь, если Вы не знаете, что сделать. –  slm♦ 30.10.2013, 14:14
  • 3
    @coder - я предоставил решение, но я все еще хотел бы, чтобы Вы разделили этот Q на 2. Я перемещу часть своего ответа отсюда дотуда того, после создания Q. Это смешивает с непрерывностью сайта, если нам смешали чрезмерно сложный Q в том же. –  slm♦ 30.10.2013, 15:22

Вы, вероятно, хотите использовать sort и uniq -c для получения корректных количеств затем используйте sed или awk сделать заключительное форматирование. Что-то вроде этого:

sort file | uniq -c | awk '{printf "%s : %s\n", $1, $2}'

На Ваш исходный вопрос можно было, вероятно, ответить с тем же основным конвейером, но сначала редактированием входа:

sed -e 's/http:\/\///' -e 's/^www\.//' file | sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'

Если это не точно корректно, можно переделать sed и awk команды для получения форм имени хоста и корректного выходного формата. Например, чтобы чистить правую сторону более длинных URL:

sed -e 's/http:\/\///' -e 's/^www\.//' -e 's/\/..*$//' file |
sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'
4
27.01.2020, 20:47
  • 1
    , что сделать, если у меня есть более длинные URL, как спросили в отредактированном вопросе? Мюон –  coder 30.10.2013, 12:40
  • 2
    @coder - см. второй сценарий. Я думаю что работы. –  Bruce Ediger 30.10.2013, 15:30

Теги

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