排序查找特定列中有多少个不同的值

排序查找特定列中有多少个不同的值

例如,这是list.txt

Joe 3
Jack 1
Ulysses 6
Fox 2
Cassidy 1
Jones 6
Kevin 7

那么输出应该是5因为第二列中有 5 个不同的值。

我应该如何仅使用来完成这个sort cut wc uniq

我有一个想法,首先使用sort -k2n按升序对第二列进行排序,然后使用uniq消除第二列重复的行,然后结果会像

Cassidy 1
Fox 2
Joe 3
Jones 6
Kevin 7

然后我用来cut -d ' ' -f2列出所有数字1 2 3 6 7 ,然后我用来wc -d计算不同值的数量,这将返回5

我应该在uniq部分中做什么来消除具有相同编号的重复行?

有没有一种简单的方法可以实现这一点?

答案1

我将从以下开始,cut因为您只关心第 2 列中的唯一性:

cut -d' ' list.txt

结果是:

1
2
1
3
6
7
6

现在你想要独特的价值观; uniq 会这样做,但前提是它已排序。如果您要排序,请继续使用排序的 -u 标志:

cut -d' ' -f2 list.txt | sort -u

结果是:

1
2
3
6
7

现在您可以使用wc来计算输出的行数:

cut -d' ' -f2 list.txt | sort -u  | wc -l

这给你:

5

请注意,我们依赖于 list.txt 文件的特定格式——人名中没有空格!

答案2

我会选择:

sort -k2,2 -u names | wc -l
5

哪里names有这个内容:

cat names
Joe 3
Jack 1
Ulysses 6
Fox 2
Cassidy 1
Jones 6
Kevin 7

答案3

既然你需要使用-sort -cut -wc -uniq,那么似乎所需的命令行应该是这样的:

$ cut -d' ' -f2 file.txt | sort -n | uniq | wc -l
5

相关内容