特定のファイルの日付で並べ替え(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

また、sortコマンドがヘッダーをキャプチャしていないことを確認する必要があります。

少し助けてください。

答え1

GNUまたはCompatible 1を使用すると、月名にソートフラグを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問題になりません。このように使用すると0head定期的なファイル(または他の検索可能ファイル)を入力として使用すると、パイプでは機能しません(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各行の前に追加します(したがって、値01、04、07、10 ...は月番号ではなく月番号に応じて数値が増加します)。その後、語彙的にソートして削除を使用します。 。xxmonthscut

awk(POSIX文字クラスをサポートしていない場合)次のようにmawk置き換えることができます(必要に応じて追加の空白文字がリストに追加されます)。[[:space:]][ \t]


1 GNUはsortGNUシステムとほとんどのBSDに存在しますが、一部のBSDは独自のGNUを互換性のあるAPIに置き換えました。 busyboxはsortこの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

関連情報