Linux 如何在以制表符分隔的文件中输出唯一项列表

Linux 如何在以制表符分隔的文件中输出唯一项列表,linux,Linux,我有一份档案 1 ABC 123 345 Apples 1 ABC 345 345 Apples 1 ABC 123 345 Apples_Fuji 1 ABC 123 345 ApplesApplesApples 1 ABC 123 345 Pears 1 ABC 123 345 Banana ... 我想得到一个输出文件 Apples 2 Apples_Fuji 1 ApplesApplesApples 1 Pears 1 Banana 1 ... 我不确定一次一个地将

我有一份档案

1 ABC 123 345 Apples

1 ABC 345 345 Apples

1 ABC 123 345 Apples_Fuji

1 ABC 123 345 ApplesApplesApples

1 ABC 123 345 Pears

1 ABC 123 345 Banana
...
我想得到一个输出文件

Apples 2

Apples_Fuji 1

ApplesApplesApples 1

Pears 1

Banana 1
...
我不确定一次一个地将它们变灰是否有效(-o无论如何都不准确,-c每次都奇怪地给我一个值1)。

试试
awk

$ awk '{arr[$NF]++}END{for(i in arr) print i,arr[i]}' file
ApplesApplesApples 1
Apples 2
Banana 1
Apples_Fuji 1
Pears 1
另一种方法是使用
grep
uniq

$ grep -oE '[^ ]+$' file | sort | uniq -c
      2 Apples
      1 Apples_Fuji
      1 ApplesApplesApples
      1 Pears
      1 Banana

使用awk/sort/uniq的一种解决方案可以是:

cat file|awk '{print $5}'|sort|uniq -c
在Perl中:

perl -lane '$h{$F[4]}++ unless(/^\s*$/);END{print "$_ $h{$_}" for(keys %h)}' your_file
测试如下:

> cat temp
1 ABC 123 345 Apples

1 ABC 345 345 Apples

1 ABC 123 345 Apples_Fuji

1 ABC 123 345 ApplesApplesApples

1 ABC 123 345 Pears

1 ABC 123 345 Banana
> perl -lane '$h{$F[4]}++ unless(/^\s*$/);END{print "$_ $h{$_}" for(keys %h)}' temp
Pears 1
ApplesApplesApples 1
Banana 1
Apples 2
Apples_Fuji 1
> 

具有切割、排序、uniq的解决方案

cat test | cut -f5,5 | sort | uniq -c

令人惊叹的。我一直在思考“awk