Bash:将目标日期与一系列日期进行比较

Bash:将目标日期与一系列日期进行比较

给定一个目标日期和一组两列(第一列是随机数,第二列是按从最近到最旧的顺序排列的日期),我想找到日期最接近但早于目标的行的数字。例如,给定以下情况:

目标: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顺序排列的,因此可以将它们作为文本进行比较(外行术语中的字典顺序或字典顺序)。

有三个字段(列),而不是两个。除非第一列的分隔符与其他列的分隔符不同。当您将分隔符表示为空格时,我们无法知道它是空格还是制表符还是其他内容。我假设三列由空格或制表符分隔。

要解决此问题,请使用搜索日期的值设置一个变量并使用以下命令:

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

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

那是:

  • 将字段 2 和 3 的串联值与搜索到的值进行比较。
  • 当这种比较成立时(下)
  • 打印第一列并退出。

答案2

我通常也会这样做awk,但这里有一个文本工具管道可以达到相同的结果:

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

相关内容