![按键显示最近一行](https://linux22.com/image/138587/%E6%8C%89%E9%94%AE%E6%98%BE%E7%A4%BA%E6%9C%80%E8%BF%91%E4%B8%80%E8%A1%8C.png)
我有一个包含一堆字段的文件:
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