Подсчитать количество уникальных вхождений в нескольких файлах

Хорошо, оказывается, это нормально. Подробнее в комментарии здесь:

https://ask.fedoraproject.org/en/question/110941/how-to-sorten-bootloader-list/

Actually, from what you're showing, it only has three Fedora kernels listed, and even if you do nothing, it will stay that way, with the oldest kernel removed every time a new one's installed. This is a safety feature in case there's a problem with a new kernel because you should always have two known good kernels to use instead. My advice is to simply leave things alone and don't worry about it. — sideburns (CC-BY-SA)

0
13.12.2019, 23:15
4 ответа

Эта команда удалит весь текст перед уникальным идентификатором, затем подсчитает количество вхождений уникальных идентификаторов и создаст их список, отсортированный в порядке возрастания появления:

cat log1 log2... logN | sed 's/^.* is related to //' | sort | uniq -c | sort -n
0
28.01.2020, 03:00

Если текст между «Some _ID» и «Unique _ID» действительно постоянный, то следующее должно работать (другими словами, например, нет метки времени):

cat log1 log2... | grep "Some_ID" | sort | uniq -c | sort -n
0
28.01.2020, 03:00

Если я правильно понимаю, вы хотите получить идентификаторы, мы можем сделать это с помощью sedи засунуть их в цикл while в grepи wc.

cat files | sed -e 's/.*is related to //g' \
| while IFS= read -r ID; do
    count=`grep $ID files | wc -l`
    echo "$ID = $count"
done
0
28.01.2020, 03:00

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

345 is related to 123
678 is related to 123
187 is related to 732
678 is related to 123

Результат должен быть 3. Для этого sort, uniq, cat, wc, и оператор трубы будет вашим другом.

Если все файлы, которые вы хотите найти, находятся в одной папке, вы можете просто использовать*(оператор подстановки )для поиска каждого файла. Например, cat *распечатает содержимое каждого файла в текущем каталоге. Вы также можете указать несколько файлов, перечислив их. cat file1.txt file2.txtнапечатает как file1, так и file2. Это можно комбинировать с подстановочным знаком для указания файлов в определенных подкаталогах :cat dir1/* dir3/*(, пропускаяdir2/). Вы также можете указать, что частичное имя файла:cat file*будет соответствовать file1и file123, но не afile.

Используя описанное выше, вы можете включить любые файлы, которые вы хотите, во входные данные для sort. Оператор конвейера(|)принимает вывод одной команды и направляет его на ввод другой. cat file1 | sortсортирует содержимое file1. Затем вы можете передать это в uniq, чтобы отфильтровать все повторяющиеся записи, а затем подсчитать строки с wc, например:cat file1 | sort | uniq | wc -l.

Используя приведенный выше пример файла, команда sortизменит вывод на:

187 is related to 732
345 is related to 123
678 is related to 123
678 is related to 123

uniqудалит повторяющиеся записи (в этом примере внизу):

187 is related to 732
345 is related to 123
678 is related to 123

и wc -lпосчитают строки и вернут 3.

ПРИМЕЧАНИЕ.:При этом123 is related to 321и321 is related to 123будут считаться двумя отдельными отношениями. Если вы хотите обойти это, вам нужно будет сделать что-то более сложное, включая анализ входных данных и организацию записей в таблицу или хэш-карту.

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

0
28.01.2020, 03:00

Теги

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