2つの日付/時刻形式で列を並べ替える

2つの日付/時刻形式で列を並べ替える

2つの異なる形式の日付を含む日付列を持つタブ区切りファイルがあります。このソートコマンドを使用して1つの型タイプ( "%a%b%d%H:%M:%S%Z%Y")でソートしていますが、日付列でソートする方法はありますか?滞在?ありがとうございます!

入力する

date
Mon Mar 02 03:56:26 UTC 2020
2020-03-03 15:46:52

sort -t$'\t' -k 3.25,3.28n -k 3.5,3.7M -k 3.9,3.10n -k 3.12,3.13n -k 3.15,3.16n -k3.18,3.19n sample.csv

答え1

両方の形式を明確な時間(たとえば、エポック時間)に変換して並べ替え、削除できます。例えばミラー

mlr --tsv put '
  $epoch = ($date =~ "^[A-Z][a-z][a-z]") ? strptime($date,"%a %b %d %H:%M:%S %Z %Y") : strptime($date,"%Y-%m-%d %H:%M:%S")
' then sort -n epoch then cut -f date input

答え2

コマンドを使用して、"%a %b %d %H:%M:%S %Z %Y"フォーマット(または認識している他のフォーマット)を()date -dに変換してみてください。%F %T%Y-%m-%d %H:%M:%Sawkdate

変換するフィールド番号はawk変数に提供されます。colフィールドがすでに正しい形式の場合は、そのフィールドをスキップします。さて、そのチェックを削除することができますが、明らかにそうするとスクリプトが遅くなります。

awk -v col=3 '
  BEGIN{ FS=OFS="\t" }

  # or remove the check and begin the next line with an opening `{`
  $(col) !~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/{
    cmd="date -u -d \"" $(col) "\" +\"%F %T\"" 
    cmd | getline $(col)
    close(cmd)
    $0=$0
  }
  1
' infile > outfile

次に、必須フィールド(たとえば)に事前ソートを使用しますsort -t$'\t' -k3,3 file

関連情報