Bir metin dosyasında yinelenen satırları sayan Linux komutu veya komut dosyası?


116

Aşağıdaki içeriğe sahip bir metin dosyam varsa

red apple
green apple
green apple
orange
orange
orange

Aşağıdaki sonucu almak için kullanabileceğim bir Linux komutu veya komut dosyası var mı?

1 red apple
2 green apple
3 orange

Yanıtlar:


215

Gönderin sort(bitişik öğeleri bir araya getirmek için) ve ardından uniq -csayıları verin, yani:

sort filename | uniq -c

ve bu listeyi sıralı olarak (sıklığa göre) almak için

sort filename | uniq -c | sort -nr

48

Borrible'larla neredeyse aynı, ancak dparam eklerseniz uniqyalnızca kopyaları gösterir.

sort filename | uniq -cd | sort -nr

1
Küçük -dnot için yaşasın .
sepehr

6

uniq -c file

ve dosyanın halihazırda sıralanmamış olması durumunda:

sort file | uniq -c


3

Bunu dene

cat myfile.txt| sort| uniq

-c veya -d bayrakları olmadan, uniq yinelenen satırları yinelenmeyenlerden ayırt etmez, yoksa bir şeyi mi kaçırıyorum?
drevicko


2

Alfabetik sıralı bir listeyle yaşayabilir misin:

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

?

green apple
orange
red apple

veya

sort -u FILE

-u benzersiz anlamına gelir ve benzersizliğe yalnızca sıralama yoluyla ulaşılır.

Sırayı koruyan bir çözüm:

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

ve bir dosya ile

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

Son ikisi yalnızca kopyaları kaldırır, hemen ardından gelen - bu sizin örneğinize uygundur.

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

Muzla bölünmüş iki elma basar.


0

Sadece saymak için:

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

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Sıralı bir sayı almak için:

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

DÜZENLE

Aha, bu kelime sınırlarını aşmadı, benim hatam. İşte tam satırlar için kullanılacak komut:

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

0

İşte Counter türünü kullanan basit bir python betiği . Bunun faydası, esasen sıfır bellek kullanarak dosyanın sıralanmasını gerektirmemesidir:

import collections
import fileinput
import json

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

Çıktı:

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

veya basit bir tek satırlık kullanabilirsiniz:

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.