คำสั่ง Linux หรือสคริปต์นับบรรทัดที่ซ้ำกันในไฟล์ข้อความ?


116

หากฉันมีไฟล์ข้อความที่มีรูปแบบต่อไปนี้

red apple
green apple
green apple
orange
orange
orange

มีคำสั่งหรือสคริปต์ Linux ที่ฉันสามารถใช้เพื่อรับผลลัพธ์ต่อไปนี้หรือไม่

1 red apple
2 green apple
3 orange

คำตอบ:


215

ส่งผ่านsort(เพื่อรวมรายการที่อยู่ติดกันเข้าด้วยกัน) จากนั้นuniq -cให้นับเช่น:

sort filename | uniq -c

และเพื่อให้ได้รายการนั้นตามลำดับ (ตามความถี่) คุณสามารถทำได้

sort filename | uniq -c | sort -nr

48

เกือบจะเหมือนกับ borribles แต่ถ้าคุณเพิ่ม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

แก้ไข

อ่านี่ไม่ได้เป็นไปตามขอบเขตของคำฉันไม่ดี นี่คือคำสั่งสำหรับใช้เต็มบรรทัด:

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

0

นี่คือสคริปต์ python อย่างง่ายโดยใช้ประเภทตัวนับ ข้อดีคือไม่ต้องเรียงไฟล์โดยใช้หน่วยความจำเป็นศูนย์:

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))'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.