按特定文件的日期排序(格式为 dd-Mmm-yyyy)

按特定文件的日期排序(格式为 dd-Mmm-yyyy)

所以我有以下文件:

    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/

如何对文件进行排序以显示最早的日期在前,最新的日期在最后?

尝试使用下面的命令,但它不起作用(它仅对日期中的天数部分进行排序,仅此而已):

sort -t "," -k 2 file

另外,我需要确保排序命令没有捕获标题。

请给我一点帮助,好吗?

答案1

使用 GNUsort或兼容的 1,您可以使用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 -n1sed -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

如果您awkmawk(不支持 POSIX 字符类),您可以替换[[:space:]][ \t](根据需要将其他空白字符添加到列表中)。


1 GNUsort存在于 GNU 系统和大多数 BSD 上,尽管一些 BSD 已用兼容的 API 替换了自己的 GNU。 busyboxsort现在也支持该M标志(尽管至少在 1.30.1 中,当与包括偏移量的关键规范结合使用时,它似乎有问题;我发现我需要删除关键端部分才能在这里工作)。

答案2

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/

答案3

我喜欢用排序因为它的灵活性。这是演示脚本的片段:

# 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   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)

最好的明智之举......干杯,drl

相关内容