我有一个.csv文件,其条目如下:
"29 January 2016 19:33 EST","Mary Z Allen",...
"01 February 2016 16:29 EST","Kendra A Zimmerman",...
"22 February 2016 12:08 EST","Shawn Baker",...
第一个CSV字段(日期/时间)由系统分配,并且始终只有五个字。第二个CSV字段(名称)由一个或多个单词组成。
我想按第二个字段中的最后一个字排序。对于此示例,排序后的所需顺序为
"29 January 2016 19:33 EST","Mary Z Allen",...
"22 February 2016 12:08 EST","Shawn Baker",...
"01 February 2016 16:29 EST","Kendra A Zimmerman",...
毫无疑问,只需付出一点努力,就可以想出一个bash,awk或python脚本来执行这种排序。但有没有办法直接使用sort命令?
我正在使用的特定Unix版本(来自/ proc / version)是
Linux version 3.13.0-79-generic (buildd@lcy01-11) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #123-Ubuntu SMP Fri Feb 19 14:28:32 UTC 2016
答案 0 :(得分:2)
awk
救援!装饰/排序/非装饰模式。
$ awk -F, '{t=$2; sub(/.+ /,"",t); print t"\t"$0}' file | sort | cut -f2-
"29 January 2016 19:33 EST","Mary Z Allen",...
"22 February 2016 12:08 EST","Shawn Baker",...
"01 February 2016 16:29 EST","Kendra A Zimmerman",...
将第二个字段的最后一个字打印为键,排序并删除虚拟键。
答案 1 :(得分:0)
没有。 sort命令可以拆分为字段,因此如果您只想按名称排序,可以执行sort -t, -k2
之类的操作。但为此,你要做的就是将线分开。这是一个非常简单的示例,用于提取要排序的事物,将其预先添加到行中,仅对第一个字段进行排序,然后删除该字段。
user@machine[/home/user/dev]
$ cat testfile
"22 February 2016 12:08 EST","Shawn Baker",...
"29 January 2016 19:33 EST","Mary Z Allen",...
"01 February 2016 16:29 EST","Kendra A Zimmerman",...
user@machine[/home/user/dev]
$ paste <(cut -d, -f2 testfile | awk '$0=$NF') testfile | sort -k1,1 | cut -f2-
"29 January 2016 19:33 EST","Mary Z Allen",...
"22 February 2016 12:08 EST","Shawn Baker",...
"01 February 2016 16:29 EST","Kendra A Zimmerman",...
请注意,提取所需字段的此代码会假设第一个和第二个字段不包含逗号:cut -d, -f2 testfile | awk '$0=$NF'
如果可能,那么您需要将其替换为更智能的内容。代码的其余部分应该没问题,因为粘贴和剪切会对标签进行默认,而sort / awk正在使用空格。
答案 2 :(得分:0)
您可以使用sed
复制线前的最后一行。这样排序很容易,您只需要删除额外的数据。
sed
命令需要使用[^"]*
查找没有双引号的字符串,从而产生
sed 's/\("[^"]*","[^"]* \)\([^"]*"\)/\2=\1\2/' testfile | sort | cut -d= -f2