Perintah atau skrip Linux menghitung baris duplikat dalam file teks?

116

Jika saya memiliki file teks dengan persetujuan berikut

red apple
green apple
green apple
orange
orange
orange

Apakah ada perintah atau skrip Linux yang dapat saya gunakan untuk mendapatkan hasil berikut?

1 red apple
2 green apple
3 orange
timeon
sumber

Jawaban:

214

Kirimkan melalui sort(untuk menyatukan barang-barang yang berdekatan) lalu uniq -cberikan hitungan, yaitu:

sort filename | uniq -c

dan untuk mendapatkan daftar itu dalam urutan yang diurutkan (berdasarkan frekuensi) Anda bisa

sort filename | uniq -c | sort -nr
mengerikan
sumber
48

Hampir sama dengan borribles 'tetapi jika Anda menambahkan dparam uniqhanya menampilkan duplikat.

sort filename | uniq -cd | sort -nr
Jaberino
sumber
1
Jempol untuk -dcatatan kecil itu .
Sepehr
6

uniq -c file

dan jika file belum diurutkan:

sort file | uniq -c

mhyfritz.dll
sumber
3

Coba ini

cat myfile.txt| sort| uniq
Rahul
sumber
tanpa tanda -c atau -d, uniq tidak membedakan baris duplikat dari non-duplikat, atau apakah saya melewatkan sesuatu?
drevicko
2
cat <filename> | sort | uniq -c
pajton
sumber
2

Bisakah Anda hidup dengan daftar urutan abjad:

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

?

green apple
orange
red apple

atau

sort -u FILE

-u singkatan dari unique, dan keunikan hanya bisa dicapai melalui sortasi.

Solusi yang mempertahankan pesanan:

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

dan, dengan file

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

Dua yang terakhir hanya menghapus duplikat, yang segera mengikuti - yang sesuai dengan contoh Anda.

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

Akan mencetak dua apel, dibelah dengan pisang.

Pengguna tidak diketahui
sumber
0

Untuk hanya menghitung:

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

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Untuk mendapatkan hitungan yang diurutkan:

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

EDIT

Aha, ini BUKAN di sepanjang batas kata, saya buruk. Inilah perintah yang digunakan untuk baris penuh:

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

Berikut adalah script python sederhana menggunakan tipe Counter . Manfaatnya adalah ini tidak memerlukan pengurutan file, pada dasarnya menggunakan nol memori:

import collections
import fileinput
import json

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

Keluaran:

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

atau Anda dapat menggunakan satu baris sederhana:

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