用于CSV文件的Unix“sort”命令

时间:2016-02-24 15:54:10

标签: bash sorting

我有一个.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

3 个答案:

答案 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