Bash上的CSV:如何获取有序列表(日志文件)中特定字段的最后状态?

时间:2019-02-22 13:37:46

标签: bash csv

我有一个简单的脚本,可以检查这些计算机打开时(这是:不规则频率)上不同计算机上的备份是否是最新的,并将状态写入日志 CSV文件(例如 logfile.csv )。

说计算机是餐馆办公室接待处大厅。我得到日志(按日期,第一个字段排序):

$ cat logfile.csv
2019-02-15,Restaurant,Outdated
2019-02-16,Office,Updated
2019-02-21,Restaurant,Updated
2019-02-21,Reception,Updated
2019-02-21,Hall,Updated
2019-02-22,Hall,Outdated
2019-02-22,Reception,Updated
2019-02-23,Office,Updated

如何获得 Bash (每台计算机的最后一个(实际)状态)(字段2)?

在我的示例中,预期结果应产生:

2019-02-21,Restaurant,Updated
2019-02-22,Hall,Outdated
2019-02-22,Reception,Updated
2019-02-23,Office,Updated

2 个答案:

答案 0 :(得分:3)

可能有更漂亮的方法,但是使用awk:

awk -F"," '{a[$2]=$0}END{for(line in a){print a[line]}}' logfile.csv | sort

所有要做的就是将每行($0)添加到一个数组(a),其中数组的键是位置($2)(餐厅,大厅等) 。数组中的元素在读取行时被最后遇到的内容覆盖。在END,我们迭代并打印出数组。将其传递以进行排序,以恢复时间顺序。

答案 1 :(得分:2)

您可以反转文件并在看到新内容时第一次打印该行:

tac logfile.csv | awk -F, '!seen[$2]++'

这是一个著名的awk习惯用法:seen[$2]++第一次返回零,然后!seen[$2]++将其转换为“ true”值。所有其他值都将转换为“ false”。

如果您事先知道希望看到多少台计算机,则可以提前退出:

tac logfile.csv | awk -F, -v num=4 '!seen[$2]++ {print; if (++count == num) exit}'
相关问题