Команда чи скрипт підрахунку дублікатів рядків у текстовому файлі?


116

Якщо у мене є текстовий файл із наступним коннектом

red apple
green apple
green apple
orange
orange
orange

Чи є команда або скрипт Linux, який я можу використовувати для отримання наступного результату?

1 red apple
2 green apple
3 orange

Відповіді:


214

Надішліть його sort(зберіть сусідні предмети разом), а потім uniq -cдайте рахунок, тобто:

sort filename | uniq -c

і отримати цей список у відсортованому порядку (за частотою) ви можете

sort filename | uniq -c | sort -nr

48

Майже те саме, що борріби, але якщо ви додасте dпарам, uniqвін показує лише дублікати.

sort filename | uniq -cd | sort -nr

1
Великі пальці вгору для маленької -dзаписки.
вересень


3

Спробуйте це

cat myfile.txt| sort| uniq

без прапорців -c або -d, uniq не відрізняє повторювані рядки від недублікатів, або я щось пропускаю?
drevicko


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

Надрукує два яблука, розділені бананом.


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

EDIT

Ага, це було НЕ за межами слова, моє погано. Ось команда для використання для повних рядків:

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

0

Ось простий скрипт python, що використовує тип Counter . Перевага полягає в тому, що для цього не потрібно сортувати файл, по суті використовуючи нульову пам'ять:

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))'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.