对 csv 文件进行排序时出现意外结果

对 csv 文件进行排序时出现意外结果

我有如下所示的 CSV 文件,有 4 列,并且我从 bash 终端输入文件名。

Sile,Barhams,Female,[email protected]
Shae,Scotti,Male,[email protected]
Shae,Bonham,Female,[email protected]
Shay,Ert,Female,[email protected]
Simeon,Dearle,Male,[email protected]

期望的输出是:

Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

现在我尝试了以下代码片段并得到了如图所示的结果:

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

有人可以解释我的两个片段以及如何获得所需的片段吗?根据我的说法,第一个代码我根据第一列进行排序,如果出现平局,我已指定稳定排序以获得所需的输出,但我不知道问题是什么,在第二个代码中,我想知道“Sile”如何出现在顶部。

答案1

cat $file | cut -d, -f1,3 | sort -k 1,1 -s

Shae,Female
Shae,Male
Shay,Female
Sile,Female
Simeon,Male

你明白了,因为字段-k引用的是空白分隔默认情况下字段并Shae,Female排序在 之前Shae,Male

您需要-t告诉它使用逗号作为分隔符的选项:

-t--field-separator=SEP
使用SEP代替非空白到空白的过渡

$ cat "$file"  | cut -d, -f1,3 | sort -t, -k 1,1 -s
Shae,Male
Shae,Female
Shay,Female
Sile,Female
Simeon,Male

cat $file  | cut -d, -f1,3 | sort -k 1,1 -s -n

Sile,Female
Shae,Male
Shae,Female
Shay,Female
Simeon,Male

这里,对于-n,排序是基于数据的数值。但这里没有数字字符串:所有非数字字符串都将被视为零。因此,实际上没有主要排序规则。使用 时-s,订单将保持原样。如果没有-ssort将退回到文本排序以获得一些结果。

答案2

奇怪的。当我将您的管道应用于该数据时,我得到

Sile
Shae
Shae
Shay
Simeon

让我们仔细看看管道:

cat filename | grep "^.\{0\}S" | cut -d, -f1,6 | sort -s -n -k1,1

首先,将其简化为

grep "^S" filename | cut -d, -f1,6 | sort -s -n -k1,1

您不需要猫(有时称为“虐待猫”),并且正则表达式要求在行开头后输入零个字符,后跟 S。这相当于以 S 开头的行。

当只有两个字段时,为什么要删除字段 1 和 6?而且我不相信结果会保留第二个字段。这里有些不对劲,但让我们忽略这个奇怪的地方cut

您执行数字排序。由于文件中没有-s指定编号,因此顺序保持不变。删除-n和/或-s.

相关内容