Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell Unix:从文件中获取最新条目_Shell_Unix - Fatal编程技术网

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我已将排序修改为与月份一起使用,现在对您有效吗?