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