С awk
:
awk 'function p(){print l,c,d; delete a; delete b; c=d=0}
NR!=1&&l!=$1{p()} ++a[$2]==1{c++} ++b[$3]==1{d++} {l=$1} END{p()}' file
Объяснение:
function p ()
: определяет функцию с именем p ()
, которая печатает значения и удаляет использованные переменные и массивы. NR! = 1 && l! = $ 1
, если это не первая строка и переменная l равна первому полю $ 1
, затем запустите функцию p ()
. ++ a [$ 2] == 1 {c ++}
, если приращение значения элемента массива a
с индексом $ 2
равно 1
, тогда это значение будет отображаться в первую очередь и, следовательно, увеличить переменную c
. ++
перед элементом возвращает новое значение, поэтому вызывает приращение перед сравнением с 1
. ++ b [$ 3] == 1 {d ++}
то же, что и выше, но с третьим полем и переменной d
. {l = $ 1}
l
до первого поля (для следующей итерации .. выше) END {p ()}
после обработки последней строки , awk
должен распечатать значения для последнего блока С указанными вами входными данными выход будет:
apple 3 2
banana 4 5
cucumber 2 3
Здесь отсортируйте по части YYYY
, а затем по части mm/dd
лексически.
Это будет от 7 -го до 10 -го символов и от 1 -го до 5-го -го второго:
-с разделителями. поля соответственно, поэтому:
<file sort -r -b -t: -k2.7,2.10 -k 2.1,2.5 | head -n 3
(здесь добавление -b
, чтобы разрешить (и игнорировать )пробелы вокруг:
)
Рассмотрите возможность использования такой сортировки:
sort -rt/ -k3n -k1.11n -k2n < input | head -3
Это сортирует строки на основе 3 ключевых полей, на основе /
разделителя :сначала год, затем месяц (поле 1, пропуская имя пользователя и двоеточие ), затем поле 2 --все отсортированы по номерам. tail -3
выводит только последние (последние )3 строки/даты.