我有一个文件,里面有名字和时间。我想保留最新时间的条目。我该怎么做?
例如:
>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
有人可以帮忙吗?
感谢。
答案 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=","
有人可以告诉我这个解决方案是否有任何问题?