按键显示最近一行

按键显示最近一行

我有一个包含一堆字段的文件:

12345 some values here
67890 other values maybe
12345 different values here

...ETC。

我想显示最近的每个键的行。输出应如下所示:

67890 other values maybe
12345 different values here

在输出中,键应该是唯一的,并且值(行的其余部分)应该是该键最近看到的值。我并不特别关心按键的最终顺序。

如何使用 GNU(或 POSIX)工具来做到这一点?

答案1

awk '{ data[$1] = $0 } END { for (key in data) print data[key] }' file

这将保存数组中每行的数据data,以第一个字段为键。当找到具有相同第一个字段的另一行时,该键的旧数据将被简单地覆盖。

最后输出数组中的所有数据。

更高的内存效率:

sort -k1,1 -s file |
awk 'NR > 1 && $1 != key { print data } { data = $0; key = $1 } END { print data }'

在这里,我们首先使用稳定的排序算法 ( ) 仅在第一列对文件进行排序-s。使用稳定的排序算法意味着具有相同键的行不会改变 的输出中相对于彼此的位置sort

然后,代码awk只需跟踪“当前密钥”和该密钥的最新数据,并在密钥更改时(以及最后)打印该数据。

答案2

我会反转文件,输出每一行第一的看到它的时间,然后反转输出

tac file | awk '!seen[$1]++' | tac

相关内容