Сортировка по дате в формате дд -Ммм -гггг из определенного файла

На рабочем столе откройте оболочку или окно терминала. В командной строке используйте команду «man», чтобы просмотреть сведения о «найти».

 prompt$  man find
 prompt$  find {path} {options}

prompt$ find /home/myName -type f -inname somefile

3
16.09.2020, 08:10
3 ответа

С 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, он кажется ошибочным в сочетании с ключевыми спецификациями, включающими смещения; Я обнаружил, что мне нужно удалить концевую часть ключа, чтобы он работал здесь ).

2
18.03.2021, 23:04

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/
1
18.03.2021, 23:04

Мне нравится использовать 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)

С наилучшими пожеланиями... ура, дрл

0
18.03.2021, 23:04

Теги

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