Как получить уникальное количество конкретной части строки

Очень вероятно у Вас есть 64-разрядное, только система (в противоположность мультиlib один) и Ваш динамический загрузчик не распознает 32-разрядный двоичный файл как исполняемый файл. Необходимо будет установить 32-разрядную версию glibc (который включает динамического компоновщика/загрузчик - и из которого, который должен быть Вами, видит на первой строке вывода strings binary, между прочим), и любые другие библиотеки двоичный файл связан против или 64-разрядная версия рассматриваемого двоичного файла. Также см. " не показанное" сообщение при выполнении 32-разрядного двоичного файла в 64-разрядной системе для получения дополнительной информации.

3
10.12.2014, 01:36
5 ответов

SWUR Решение

awk -F'-' '{sub(/[^[:digit:]]+/, "", $1); a[$1]} END{for (k in a) ++i; print i}' file
8
0
27.01.2020, 21:11

С помощью grep отфильтровать только цифры:

.
grep -Eo '[0-9]+-' file | sort -u | wc -l
  • [0-9] Совпадает с любым символом от 0 до 9 (любая цифра).
  • + в расширенных регулярных выражениях означает по крайней мере один символ (поэтому опция -E используется с grep). Таким образом, [0-9]+- соответствует одной или нескольким цифрам, за которыми следует -.
  • -o печатает только ту часть, которая соответствует вашему образцу, поэтому при вводе abcd23-gf56, grep будет печататься только 23-.
  • сортирует -u сортирует и фильтрует уникальные записи (в связи с -u), а wc -l подсчитывает количество строк во входных данных (отсюда и количество уникальных записей).
6
27.01.2020, 21:11

Используйте расширенный grep и ищите четыре цифры, говоря grep только перечислять совпадения (в отличие от целой строки, которая используется по умолчанию):

grep -Eo '[0-9]+' <filename>

Отсортируйте этот список чисел и выведите только уникальные:

sort -u

Посчитайте количество строк:

wc -l

Сложите все вместе:

$ grep -Eo '[0-9]+' filename | sort -u | wc -l
8
1
27.01.2020, 21:11

С помощью , без труб оболочки (быстрее) :

$ perl -lne '/\d+-/ and $h{$&}++;END{print scalar keys %h}' file
0
27.01.2020, 21:11

Вы можете использовать:

tr -dc '\-0-9\n' | sort -u -t- -nk1,1 | grep -c .

... что, по общему признанию, более чем немного вдохновлено ответом муру. Однако, по-другому я использую grep для подсчета строк, а не wc, если на входе есть пустые строки. В его ответе нет проблемы с пустыми строками, так как grep -o выведет только строки с их совпадением (так как здесь grep -c считает только их), но tr does выводит пустые строки, так как новая строка является одним из немногих символов, которые она не удаляет. Это означает, что любое количество пустых строк во входных данных исказит результаты работы wc на единицу.

Таким образом, tr здесь, вероятно, более эффективен, чем grep -o, но, вероятно, wc бьет grep в отделе счета. Мне нравится, что так я думаю из соображений переносимости, а также потому, что обычно я стараюсь сначала подрезать данные самым эффективным фильтром, а менее эффективные - использовать позже в цепочке.

Это позволяет сортировать выбирать биты на строку, которые он будет рассматривать в своем -unique сортировке, основываясь на своем -numeric сортировке -key, которую он разбивает на свой -t-ab разделитель. tr -dвозводит во входной сигнал -cэлемент любого числового, тире или байта новой строки. Таким образом - до тех пор, пока не появится -тире, возникающей до числовых строк, которые вы хотите сравнить, единственной вещью, оставшейся до любой строки, будет:

#nothing at all

...или......

[numbers]

... или....

[numbers]-[more numbers]more-dashes-...

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

Итак, мы grep -count строк, содержащих хотя бы одну . Символ . Следующая команда печатает 8:

tr -dc '\-0-9\n' <<\IN | sort -u -t- -nk1,1 | grep -c .
psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-pro-09-0jm
mnp7330-redir09o-0ect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support


unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply
IN
1
27.01.2020, 21:11

Теги

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