だから、次のファイルがあります。
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
問題になりません。このように使用すると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
各行の前に追加します(したがって、値01、04、07、10 ...は月番号ではなく月番号に応じて数値が増加します)。その後、語彙的にソートして削除を使用します。 。xx
months
cut
awk
(POSIX文字クラスをサポートしていない場合)次のようにmawk
置き換えることができます(必要に応じて追加の空白文字がリストに追加されます)。[[:space:]]
[ \t]
1 GNUはsort
GNUシステムとほとんどのBSDに存在しますが、一部のBSDは独自のGNUを互換性のあるAPIに置き換えました。 busyboxはsort
このM
フラグもサポートしています(少なくとも1.30.1では、オフセットを含む主要な仕様と組み合わせると問題があるようです。ここで動作するにはキーの最後を削除する必要があることがわかりました)。