У меня есть этот awk-скрипт, который запускает файл и подсчитывает каждое вхождение данной даты. Формат даты в исходном файле является стандартным форматом даты, например:
Thu Mar 5 16:46:15 EST 2009
Я использую awk, чтобы отбросить день недели, время и часовой пояс, а затем выполняю мой подсчет, закачивая даты в ассоциативный массив с датами как индексы.
Чтобы отсортировать выходные данные по дате, я преобразовал даты в другой формат, который можно сортировать с помощью bash sort.
Теперь мой вывод выглядит так:
Date Count
03/05/2009 2
03/06/2009 1
05/13/2009 7
05/22/2009 14
05/23/2009 7
05/25/2009 7
05/29/2009 11
06/02/2009 12
06/03/2009 16
Мне бы очень хотелось, чтобы в выводе было больше удобочитаемых дат, например:
Mar 5, 2009
Mar 6, 2009
May 13, 2009
May 22, 2009
May 23, 2009
May 25, 2009
May 29, 2009
Jun 2, 2009
Jun 3, 2009
Есть предложения, как я могу это сделать? Если бы я мог сделать это на лету, когда я вывел бы подсчитанные значения, которые были бы наилучшими.
UPDATE:
Вот мое решение, включающее пример кода ghostdog74:
grep -i "E[DS]T 2009" original.txt | awk '{printf "%s %2.d, %s\r\n",$2,$3,$6}' >dates.txt #outputs dates for counting
date -f dates.txt +'%Y %m %d' | awk ' #reformat dates as YYYYMMDD for future sort
{++total[$0]} #pump dates into associative array
END {
for (item in total) printf "%s\t%s\r\n", item, total[item] #output dates as yyyy mm dd with counts
}' | sort -t \t | awk ' #send to sort, then to cleanup
BEGIN {printf "%s\t%s\r\n","Date","Count"}
{t=$1" "$2" "$3" 0 0 0" #cleanup using example by ghostdog74
printf "%s\t%2.d\r\n",strftime("%b %d, %Y",mktime(t)),$4
}'
rm dates.txt
Извините, это выглядит так грязно. Я попытался добавить уточняющие комментарии.