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

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

48

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

sort filename | uniq -cd | sort -nr

1
Jempol untuk -dcatatan kecil itu .
Sepehr


3

Coba ini

cat myfile.txt| sort| uniq

tanpa tanda -c atau -d, uniq tidak membedakan baris duplikat dari non-duplikat, atau apakah saya melewatkan sesuatu?
drevicko


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.


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

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))'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.