Shell Unix:从文件中获取最新条目
我有一个文件,里面有名字和时间。我只想保留最新时间的条目。我该怎么做 例如:Shell Unix:从文件中获取最新条目,shell,unix,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
>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
有人能帮忙吗
谢谢。试试这个:
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=","
试试这个:
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=","
这个怎么样
grep `cut -d'"' -f4 user.txt | sort -t- -k 3 -k 2M -k 1n | tail -1` user.txt
说明:使用前面的排序方法,获取带有tail-1的最新条目,提取该日期(使用逗号分隔符剪切时的第二列),然后对该日期进行排序和grep
编辑:固定为按月排序。这个怎么样
grep `cut -d'"' -f4 user.txt | sort -t- -k 3 -k 2M -k 1n | tail -1` user.txt
说明:使用前面的排序方法,获取带有tail-1的最新条目,提取该日期(使用逗号分隔符剪切时的第二列),然后对该日期进行排序和grep
编辑:固定为按月排序。对我来说,这就是工作。我正在对月份进行排序,然后应用@neevek使用的逻辑。到目前为止,我还找不到一个不符合这个条件的案例。但我不确定这是否是一个全面的解决方案
sort -t- -k2 -M user1.txt | awk -F, '{a[$1]=$2}END{for(e in a){print e, a[e]}}' OFS=","
有人能告诉我这个解决方案有什么问题吗?对我来说,这就是工作。我正在对月份进行排序,然后应用@neevek使用的逻辑。到目前为止,我还找不到一个不符合这个条件的案例。但我不确定这是否是一个全面的解决方案
sort -t- -k2 -M user1.txt | awk -F, '{a[$1]=$2}END{for(e in a){print e, a[e]}}' OFS=","
有人能告诉我这个解决方案是否有任何问题吗?我认为您需要对年、月和日进行排序 你能试试这个吗
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]}}'
我想你需要把年、月、日分类 你能试试这个吗
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]}}'
你的意思是“a”,“13-May-13”,还是你打算去掉尾随“?另外,你想要第一个字段,还是只想要日期?@Arafangion我故意留下尾随引号。我想要两个字段。你的意思是“a”,“13-May-13”,还是你打算去掉尾随“?另外,你想要第一个字段,还是只有日期?@Arafangion我故意留下了后面的引语。我想要两个字段。忽略了“-k2”选项,这确实简化了答案!谢谢@neevek。您的解决方案很好,但存在问题。它看起来是在做词典比较。对于以下测试用例,它失败<代码>“a”、“2013年5月3日”b、“2013年5月13日”a、“2013年5月11日”a、“2013年5月13日”@RachitAgrawal,请参见我的编辑。遗漏了那里的“-k2”选项,这在一定程度上简化了答案!谢谢@neevek。您的解决方案很好,但存在问题。它看起来是在做词典比较。对于以下测试用例,它失败<代码>“a”、“2013年5月3日”b、“2013年5月13日”a、“2013年5月11日”a、“2013年5月13日”@RachitAgrawal,请参阅我的编辑。@RachitAgrawal我已将排序修改为与月份一起使用,现在对您有效吗?@RachitAgrawal我已将排序修改为与月份一起使用,现在对您有效吗?