Вы могли бы сделать что-то вроде:
tr ' ' '\n' <infile \
| sort -n \
| uniq -c \
| awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'
Или даже:
tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c
Или лучше обойтись awk
в одиночку:
awk '{ seen[$0]++ }
END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4
В приведенном выше awk
, в seen[$0]++
для каждой записи R S , разделенной либо пробелом, либо \n
ewline, вся запись сохраняется в связанном массиве с именем seen
как ключ, и его значение увеличивается при повторном просмотре того же ключа.
В END{... }
, когда все записи будут прочитаны, этот блок будет выполнен, и для каждого ключа (мы определяем x
как индекс переменной для обхода всех элементов в этом массиве, используя цикл for ), сохраненный в видимом массиве, мы использовали значение , видимое seen[x]
, в качестве ключа нового массива с именем count
, и снова его значение увеличивалось для того же ключа.
Позже мы использовали другой цикл и y
в качестве индекса переменной, чтобы вывести сначала их значения count[y]
(, которые являются счетчиками )и y
ключами.
Один способ с bash, файлы между 20:00
и22:00
#!/usr/bin/env bash
for f in /folder/x/*.bak; do
var=$(date -r "$f" '+%H:%M')
if [[ $var > '20:00' && $var < '22:00' ]]; then
echo "$f"
fi
done
[[ $var < '20:15' ]]
Если это именно то, что вам нужно. date
работает как с GNU
, так и с BSD
date(1)
РЕДАКТИРОВАТЬ :Обновленный ответ
Благодаря ответу Джетчизеля я смог найти решение:
#!/bin/bash
for file in /folder/X/*.bak; do
MODIFIED_DATE=$(stat --format="%y" $file | awk '{print $2}')
if [[ $MODIFIED_DATE < '20:15' ]]; then
printf 'rm -rf %s\n' "$file"
fi
done
stat --format="%y"
показывает дату последнего изменения в этом формате 2020-02-02 19:11:34.000000000 +0100
. Используя awk, я выбираю время, которое мне нужно, и с его помощью я могу определить, был ли файл создан до 20 :15, и таким образом удалить его. Это не чистый -вкладыш, но, по крайней мере, работает :).