Unix:从文件中获取最新条目

时间:2013-05-24 06:48:20

标签: shell unix

我有一个文件,里面有名字和时间。我想保留最新时间的条目。我该怎么做?

例如:

>cat user.txt
"a","03-May-13
"b","13-May-13
"a","13-Aug-13
"a","13-May-13

我正在使用命令sort -u user.txt。它提供以下输出:

"a","11-May-13
"a","13-Aug-13
"a","13-May-13
"b","13-May-13

但我想要以下输出。

"a","13-Aug-13
"b","13-May-13

有人可以帮忙吗?

感谢。

4 个答案:

答案 0 :(得分:3)

试试这个:

sort -t, -k2 user.txt | awk -F, '{a[$1]=$2}END{for(e in a){print e, a[e]}}' OFS=","

说明:

按日期字段按升序对条目进行排序,将排序后的结果输出到awk,后者只使用第一个字段作为键,因此只保留具有相同键的条目的最后一个条目并最终输出。

修改

好的,所以我无法按字典顺序对条目进行排序。日期需要转换为时间戳,以便可以用数字进行比较,使用以下内容:

awk -F",\"" '{ cmd=" date --date " $2 " +%s "; cmd | getline ts; close(cmd); print ts, $0, $2}' user.txt | sort -k1 | awk -F"[, ]" '{a[$2]=$3}END{for(e in a){print e, a[e]}}' OFS=","

如果您使用的是MacOS,请改用gdate

awk -F",\"" '{ cmd=" gdate --date " $2 " +%s "; cmd | getline ts; close(cmd); print ts, $0, $2}' user.txt | sort -k1 | awk -F"[, ]" '{a[$2]=$3}END{for(e in a){print e, a[e]}}' OFS=","

答案 1 :(得分:1)

我认为您需要按年,月和日排序。

你能试试吗

awk -F"\"" '{print $2"-"$4}' data.txt | sort -t- -k4 -k3M -k2 | awk -F- '{kv[$1]=$2"-"$3"-"$4}END{for(k in kv){print k,kv[k]}}'

答案 2 :(得分:0)

这个怎么样?

grep `cut -d'"' -f4 user.txt | sort -t- -k 3 -k 2M -k 1n | tail -1` user.txt

解释:像你一样使用sort,获取尾部-1的最新条目,提取该日期(使用逗号分隔符剪切时的第二列),然后对其进行排序和grep。

编辑:修复以按月排序。

答案 3 :(得分:0)

对我而言,这是在做这项工作。我在月份上进行排序,然后应用@neevek使用的逻辑。直到现在我无法找到一个失败的案例。但我不确定这是否是一个完整的证明解决方案。

sort -t- -k2 -M user1.txt | awk -F, '{a[$1]=$2}END{for(e in a){print e, a[e]}}' OFS=","

有人可以告诉我这个解决方案是否有任何问题?