0

我有一个文件,其中有名称和时间。我只想保留最新时间的条目。我该怎么做?

例如:

>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

4 回答 4

3

尝试这个:

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

解释:

按日期字段升序对条目进行排序,将排序结果通过管道传递给 awk,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=","
于 2013-05-24T06:54:57.237 回答
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]}}'
于 2013-05-24T07:57:19.957 回答
0

这个怎么样?

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

解释:按照您所做的那样使用排序,获取带有尾 -1 的最新条目,提取该日期(使用逗号分隔符切割时的第二列),然后对其进行排序和 grep。

编辑:固定按月排序。

于 2013-05-24T07:23:30.807 回答
0

对我来说,这就是工作。我正在对月份进行排序,然后应用@neevek 使用的逻辑。到目前为止,我无法找到一个失败的案例。但我不确定这是否是一个完整的证明解决方案。

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

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

于 2013-05-24T07:38:01.780 回答