Найти общее количество повторений чисел в файле

это так, чтобы вы могли использовать разные единицы времени вместе

sleep  183965

тот же эффект, что и

sleep 2d 3h 6m 5s

Но второй вариант легче понять людям как два дня, три часа, шесть минут и пять секунд.

0
24.07.2020, 19:32
3 ответа

Чтобы получить список повторяющихся чисел и исключить все лишние процессы:

$ awk -F= '$1=="Global"{c[$2]++} END{for (num in c) if(c[num]>1)print num}' file.dat
33333
33337

Приведенный выше код использует =в качестве разделителя полей. Если первое поле равно Global, то мы отслеживаем в ассоциативном массиве cколичество раз, когда второе поле $2появлялось в файле.

После того, как файл прочитан полностью, мы просматриваем массив cи выводим все числа, число которых больше 1.

Сокращенная версия

Как предложил glenn jackman в комментариях, мы могли бы просто напечатать число при его втором появлении:

$ awk -F= '++c[$2] == 2 {print $2}' file.dat
33333
33337
1
18.03.2021, 23:17

Вы можете изменить uniq -cнаuniq -d:

$ grep -Po '(Global)=\K\d+' file.dat | sort | uniq -d
33333
33337

-dпечатает только повторяющиеся строки. Еще одна труба к wc -lможет подсчитывать эти строки. Также обратите внимание, что обе опции -Pи -oдля grep не являются стандартными для -, поэтому они будут доступны не во всех версиях grep.

2
18.03.2021, 23:17

Использование любого awk в любой оболочке на каждом компьютере UNIX:

$ awk -F'=' '++cnt[$2] == 2{ dups++ } END{print dups+0}' file
2

Если вам нужно проверить Global, тогда:

$ awk -F'=' '($1 == "Global") && (++cnt[$2] == 2){ dups++ } END{print dups+0}' file
2

+0в END гарантирует, что вы получите числовой вывод(0вместо нулевой строки ), даже если во входных данных нет дубликатов.

0
18.03.2021, 23:17

Теги

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