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

时间:2011-06-22 22:48:21

标签: linux text duplicates

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

red apple
green apple
green apple
orange
orange
orange

是否有可用于获取以下结果的Linux命令或脚本?

1 red apple
2 green apple
3 orange

8 个答案:

答案 0 :(得分:196)

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

sort filename | uniq -c

并按排序顺序(按频率)获取该列表,您可以

sort filename | uniq -c | sort -nr

答案 1 :(得分:45)

与borribles几乎相同'但如果您将d参数添加到uniq,则只显示重复项。

sort filename | uniq -cd | sort -nr

答案 2 :(得分:6)

uniq -c file

如果文件尚未排序:

sort file | uniq -c

答案 3 :(得分:3)

试试这个

cat myfile.txt| sort| uniq

答案 4 :(得分:2)

你能按照字母顺序排列的列表:

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
" ...

将打印两个苹果,用香蕉分开。

答案 5 :(得分:2)

cat <filename> | sort | uniq -c

答案 6 :(得分:0)

要得到一个计数:

$> 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

答案 7 :(得分:0)

这是使用Counter类型的简单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))'