Большинство инструментов Unix разработано для работы хорошо с текстовыми файлами. Текстовый файл состоит из последовательности строк. Строка состоит из последовательности печатаемых символов, заканчивающихся символом новой строки. В частности, последний знак непустого текстового файла всегда является символом новой строки. Очевидно, example.txt
содержит только some text
без заключительной новой строки, таким образом, это не текстовый файл.
cat
делает простое задание; превращение произвольных файлов в текстовые файлы не является частью того задания. Некоторые другие инструменты всегда превращают свой вход в текстовые файлы; если Вы не уверены файл, Вы отображаете концы с новой строкой, пытаетесь работать awk 1
вместо cat
.
Можно заставить удар отобразить свою подсказку на следующей строке, если предыдущая команда оставила курсор где-нибудь кроме последнего поля. Вставьте это Ваш .bashrc
(изменение GetFree предложения Dennis Williamson):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
Принятие следующего формата ввода:
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
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
Вы, вероятно, хотите использовать 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}'