用于排序CSV的Unix命令之间的差异

时间:2016-01-28 18:42:34

标签: linux sorting csv unix

之间的区别是什么:

!tail -n +2 hits.csv | sort -k 1n -o output.csv

!tail -n +2 hits.csv | sort -t "," -k1 -n -k2 > output.csv

? 我试图先按第一列排序csv文件,然后按第二列排序,这样第一列相同的行仍在一起。

似乎第一个已经正确地执行了这一操作,首先按第一个逗号之前的字段排序,然后按第一个逗号之后的字段排序。 (打破关系,就是这样。)

或者它实际上不是那样做的吗?

第二个命令是什么意思? (以及两者之间的区别是什么?)当我运行两个时,两个output.csv文件之间存在显着差异。

最后,我应该使用哪一个? (或者他们都错了?)

2 个答案:

答案 0 :(得分:1)

首先关闭:您要从这两个命令中删除前导!。在Bash中(可能是其他人,因为这来自csh)你在引用历史记录中包含tail的最后一个命令,这里没有意义。

两个版本之间的主要区别在于,在第一种情况下,您没有考虑第二列。

我就是这样做的:

tail -n +2 hits.csv | sort -t "," -n --key=1,1 --key=2,2 > output.csv
  • -t指定字段分隔符
  • -n启用数字排序顺序
  • --key指定应该用于排序的字段(按优先顺序排列)

答案 1 :(得分:1)

另请参阅@morido关于其他一些指针的答案,但这里有一个关于这两个sort调用究竟是什么的描述:

sort -k 1n -o output.csv

这假定"字段"在你的文件中由非空格到空格的转换分隔(即每个字段中包含前导空格,不像许多人可能期望/假设那样被剥离),并告诉sort按照开始的键来排序使用第一个字段并延伸到行的末尾,并假定键被格式化为数值。输出将显式发送到特定文件。

sort -t "," -k1 -n -k2

这将字段分隔符定义为逗号,然后定义两个要排序的键。第一个键再次从第一个字段开始并延伸到行的末尾并且是字典(字典顺序),而不是数字,第二个键(将在第一个键的值相同时使用)从第二个键开始字段并延伸到行的末尾,并且由于介入的-n,也将被假定为数字数据。但是,因为你的第一个键需要整行,基本上不太可能需要第二个键(如果两个单独行的第一个键相同,则第二个键很可能也是如此)。

由于您没有提供样本数据,因此不知道前两个字段中的数据是否为数字,但我怀疑您想要的内容类似@morido的回答中所建议的内容:

sort -t, -k1,1 -k2,2

sort -t, -k1,1n -k2,2n          (alternatively sort -t, -n -k1,1 -k2,2)

如果数据是数字。