Bash:目標日付を日付範囲と比較

Bash:目標日付を日付範囲と比較

ターゲット日付と2つの列のセット(最初の列はランダムな数字で、2番目の列は最新から古い日付の順に)が与えられた場合、日付は最も近いが前の行で数字を探したいと思います。目標。たとえば、次のような状況が与えられます。

ターゲット:2018-12-03 19:09:56.250641

リスト:

5346    2018-12-06 17:44:35.010724
6347    2018-12-05 17:50:46.475593
7284    2018-12-04 18:32:11.665405
0298    2018-12-02 22:28:04.59453
1836    2018-12-02 22:27:47.585642
6653    2018-12-02 21:26:13.942103
9274    2018-12-02 21:23:28.318704

私は戻りたいです0298。最もきれいな方法は何ですか?

答え1

日付はY-M-D H:M:S順番になっているので、テキスト(辞書順または一般用語でアルファベット順)で比較できます。

2つではなく3つのフィールド(列)があります。最初の列の区切り文字が他の列の区切り文字と異なる場合。区切り文字を空白として表示するときに、それが空白かタブか他のものかを知る方法はありません。 3つの列がスペースまたはタブで区切られているとします。

この問題を解決するには、検索日の値に変数を設定し、次のコマンドを使用します。

 s='2018-12-03 19:09:56.250641'

 awk -vs="$s" '( $2" "$3 < s ){ print $1; exit }' infile

それは:

  • フィールド 2 と 3 の関連付けられた値を検索された値と比較します。
  • この比較が成立するとき(2部)
  • 最初の列を印刷して終了します。

答え2

私も通常これを行いますawkが、同じ結果を得るテキストツールパイプラインは次のとおりです。

$ echo "0000    $s" | sort -k2 - infile | grep -B1 "$s" | head -1 | cut -d" " -f1
0298

関連情報