prompt$ man find
prompt$ find {path} {options}
С GNU sort
или совместимым¹ вы можете использовать флаг сортировки M
для названий месяцев:
{
head -n1
LC_ALL=C sort -t, -k2.9n -k2.5,2.7M -k2n
} < file
Или игнорировать пробел после ,
(, если это не всегда точно один символ SPC):
{
head -n1
LC_ALL=C sort -t, -k2.8bn -k2.4b,2.6bM -k2n
} < file
(здесь используется локаль C, чтобы ожидать названия месяцев на английском языке, а не на языке пользователя ).
Здесь мы избегаем передачи заголовка в sort
, но это не было бы проблемой, если бы мы сделали так, поскольку первый ключ сортировки (год )для этого заголовка оценивался бы как 0
и был бы отсортировано первым. Используя head
, как это работает для обычного файла (или других доступных для поиска файлов )в качестве входных данных, это не будет работать для каналов (с GNU sed
, вы можете заменить head -n1
сsed -u q
).
POSIXly вы могли бы сделать что-то вроде:
awk -F',[[:space:]]*' -v months=JanFebMarAprMayJunJulAugSepOctNovDec '
NR == 1 {print; next}
{
split($2, f, "-")
printf "%04d%02d%02d\t%s\n", f[3], index(months, f[2]), \
f[1], $0 | "sort | cut -f2-"
}' < file
Где мы предваряем каждую строку (, кроме первой, которая печатается первой без изменений )с 2020xx15
, где xx
— позиция аббревиатуры месяца внутри этой months
переменной (, поэтому значения 01, 04, 07, 10...не номера месяцев, а что-то, что растет с номером месяца ), которые затем сортируются лексически и удаляются с помощью cut
.
Если ваш awk
— это mawk
(, который не поддерживает классы символов POSIX ), вы можете заменить [[:space:]]
на[ \t]
(и добавить в список другие символы пробела по мере необходимости ).
¹ GNU sort
можно найти в системах GNU и большинстве BSD, хотя некоторые BSD с тех пор заменили его своим собственным с совместимым API. busybox sort
теперь также поддерживает этот флаг M
(, хотя, по крайней мере, с 1.30.1, он кажется ошибочным в сочетании с ключевыми спецификациями, включающими смещения; Я обнаружил, что мне нужно удалить концевую часть ключа, чтобы он работал здесь ).
Perl может анализировать и сортировать даты:
perl -MTime::Piece -F, -ane '
next if $. == 1;
push @lines, [$_, Time::Piece->strptime($F[1], " %d-%b-%Y")->epoch];
END {
@sorted = sort {$a->[1] <=> $b->[1]} @lines;
print $sorted[$_]->[0] for (0,-1);
}
' file
CN=sv999-c.int.de.aaas.internet.go.com:testclient, 31-Oct-2020, vm, /path/to/file/
CN=server26.de.go.com:app, 06-Feb-2021, physical, /path/to/file/
Мне нравится использовать msort из-за его гибкости. Вот фрагмент демонстрационного скрипта:
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data file $FILE:"
head $FILE
pl " Modified ( ', ' -> ',') input file t1:"
sed 's/, /,/g' $FILE > t1
head t1
pl " Results, msort:"
{
head -n1
msort -q -l -j -d "," -n 2,2 --comparison-type date --date-format "d-m-y"
} < t1
производство:
-----
Input data file data1:
Certificate Name,Expiry Date,Type,Certificate file path
CN=server10.de.go.com:app, 16-Jan-2021, physical, /path/to/file/
CN=sv999-c.int.de.aaas.internet.go.com:testclient, 31-Oct-2020, vm, /path/to/file/
CN=server26.de.go.com:app, 06-Feb-2021, physical, /path/to/file/
-----
Modified ( ', ' -> ',') input file t1:
Certificate Name,Expiry Date,Type,Certificate file path
CN=server10.de.go.com:app,16-Jan-2021,physical,/path/to/file/
CN=sv999-c.int.de.aaas.internet.go.com:testclient,31-Oct-2020,vm,/path/to/file/
CN=server26.de.go.com:app,06-Feb-2021,physical,/path/to/file/
-----
Results, msort:
Certificate Name,Expiry Date,Type,Certificate file path
CN=sv999-c.int.de.aaas.internet.go.com:testclient,31-Oct-2020,vm,/path/to/file/
CN=server10.de.go.com:app,16-Jan-2021,physical,/path/to/file/
CN=server26.de.go.com:app,06-Feb-2021,physical,/path/to/file/
Запустить:
Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 5.7.0-3-amd64, x86_64
Distribution : Debian GNU/Linux bullseye/sid
bash GNU bash 5.0.18
Часть гибкости обеспечивается хорошим дизайном функций, например, из справочной страницы:
-f,--date-format <date format>
Permutation of ymd with separators, e.g. y-m-d for international
date format, m/d/y for American date format, or a permutation of
yd with separators, e.g. y-d, for day-of-year dates. All three
components may be numbers in any available number system. The
month field may also be a month name, determined by the same de-
vices as independent month name fields.
Код msort доступен во многих репозиториях, вот дополнительная информация:
msort sort records in complex ways (man)
Path : /usr/bin/msort
Version : 8.53
Type : ELF 64-bit LSB shared object, x86-64, version 1 (...)
Help : probably available with -h,--help
Repo : Debian GNU/Linux bullseye/sid
Home : http://www.billposer.org/Software/msort.html (pm)
С наилучшими пожеланиями... ура, дрл