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

Uly*_*ses 2 sort cut uniq wc

例如,这是list.txt

Joe 3
Jack 1
Ulysses 6
Fox 2
Cassidy 1
Jones 6
Kevin 7
Run Code Online (Sandbox Code Playgroud)

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

我应该如何通过仅使用来完成此操作sort cut wc uniq

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

Cassidy 1
Fox 2
Joe 3
Jones 6
Kevin 7
Run Code Online (Sandbox Code Playgroud)

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

uniq消除相同编号的重复行的部分应该怎么做?

有没有简单的方法来实现这一点?

Jef*_*ler 5

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

cut -d' ' list.txt
Run Code Online (Sandbox Code Playgroud)

结果是:

1
2
1
3
6
7
6
Run Code Online (Sandbox Code Playgroud)

现在您需要唯一值;uniq 会这样做,但前提是它已排序。如果要排序,请继续使用 sort 的 -u 标志:

cut -d' ' -f2 list.txt | sort -u
Run Code Online (Sandbox Code Playgroud)

结果是:

1
2
3
6
7
Run Code Online (Sandbox Code Playgroud)

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

cut -d' ' -f2 list.txt | sort -u  | wc -l
Run Code Online (Sandbox Code Playgroud)

这给了你:

5
Run Code Online (Sandbox Code Playgroud)

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