Lệnh hoặc tập lệnh Linux đếm các dòng trùng lặp trong tệp văn bản?


116

Nếu tôi có một tệp văn bản có hình nón sau

red apple
green apple
green apple
orange
orange
orange

Có lệnh hoặc tập lệnh Linux nào mà tôi có thể sử dụng để nhận được kết quả sau không?

1 red apple
2 green apple
3 orange

Câu trả lời:


214

Gửi nó qua sort(để đặt các mục liền kề với nhau) sau đó uniq -cđưa ra số lượng, tức là:

sort filename | uniq -c

và để có được danh sách đó theo thứ tự đã sắp xếp (theo tần suất), bạn có thể

sort filename | uniq -c | sort -nr

48

Gần giống như borribles 'nhưng nếu bạn thêm thông số dvào uniqnó chỉ hiển thị các bản sao.

sort filename | uniq -cd | sort -nr

1
Thích cho -dghi chú nhỏ .
sepehr

6

uniq -c file

và trong trường hợp tệp chưa được sắp xếp:

sort file | uniq -c


3

Thử cái này

cat myfile.txt| sort| uniq

không có cờ -c hoặc -d, uniq không phân biệt các dòng trùng lặp với các dòng không trùng lặp, hoặc tôi thiếu thứ gì đó?
drevicko


2

Bạn có thể sống với một danh sách theo thứ tự bảng chữ cái:

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

?

green apple
orange
red apple

hoặc là

sort -u FILE

-u là viết tắt của độc nhất, và tính duy nhất chỉ đạt được thông qua phân loại.

Một giải pháp duy trì thứ tự:

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

và, với một tệp

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

Hai cách cuối cùng chỉ xóa các bản sao, sẽ theo sau ngay lập tức - phù hợp với ví dụ của bạn.

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

Sẽ in hai quả táo, tách bởi một quả chuối.


0

Để chỉ cần đếm:

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

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Để có được số lượng được sắp xếp:

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

BIÊN TẬP

Aha, điều này KHÔNG dọc theo ranh giới từ ngữ, tệ của tôi. Đây là lệnh để sử dụng cho các dòng đầy đủ:

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

0

Đây là một tập lệnh python đơn giản sử dụng loại Bộ đếm . Lợi ích là điều này không yêu cầu phân loại tệp, về cơ bản sử dụng bộ nhớ bằng không:

import collections
import fileinput
import json

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

Đầu ra:

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

hoặc bạn có thể sử dụng một lớp lót đơn giản:

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.