我有如下所示的 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
,订单将保持原样。如果没有-s
,sort
将退回到文本排序以获得一些结果。
答案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
.