Linux 命令或脚本计数文本文件中的重复行?

如果我有一个具有以下内容的文本文件

red apple
green apple
green apple
orange
orange
orange

是否有一个 Linux 命令或脚本,我可以使用以下结果?

1 red apple
2 green apple
3 orange
104548 次浏览

你能接受按字母顺序排列的清单吗:

echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u

green apple
orange
red apple

或者

sort -u FILE

U 代表唯一性,唯一性只有通过排序才能达到。

一种保持顺序的解决方案:

echo "red apple
green apple
green apple
orange
orange
orange
" | { old=""; while read line ; do   if [[ $line != $old ]]; then  echo $line;   old=$line; fi ; done }
red apple
green apple
orange

还有一份文件

cat file | {
old=""
while read line
do
if [[ $line != $old ]]
then
echo $line
old=$line
fi
done }

最后两个只删除重复项,重复项紧随其后——这符合您的示例。

echo "red apple
green apple
lila banana
green apple
" ...

将印刷两个苹果,由香蕉分裂。

uniq -c file

如果文件尚未排序:

sort file | uniq -c

cat <filename> | sort | uniq -c

试试这个

cat myfile.txt| sort| uniq

发送到 sort(将相邻的项目放在一起) ,然后发送到 uniq -c给出计数,即:

sort filename | uniq -c

并且要按照排序顺序(按频率)得到这个列表,您可以

sort filename | uniq -c | sort -nr

只要数一下:

$> egrep -o '\w+' fruits.txt | sort | uniq -c


3 apple
2 green
1 oragen
2 orange
1 red

要获得排序计数:

$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red
2 green
2 orange
3 apple

剪辑

啊哈,我的错,这不是单词界限。下面是用于完整行的命令:

$> cat fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red apple
2 green apple
2 orange

几乎相同的硼砂’,但如果你把 d参数到 uniq它只显示重复。

sort filename | uniq -cd | sort -nr

下面是一个使用 柜台类型的简单 Python 脚本。这样做的好处是不需要对文件进行排序,基本上不需要使用任何内存:

import collections
import fileinput
import json


print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))

产出:

$ cat filename | python3 script.py
{
"red apple": 1,
"green apple": 2,
"orange": 3
}

或者你可以用一句简单的俏皮话:

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'