หากฉันมีไฟล์ข้อความที่มีรูปแบบต่อไปนี้
red apple
green apple
green apple
orange
orange
orange
มีคำสั่งหรือสคริปต์ Linux ที่ฉันสามารถใช้เพื่อรับผลลัพธ์ต่อไปนี้หรือไม่
1 red apple
2 green apple
3 orange
หากฉันมีไฟล์ข้อความที่มีรูปแบบต่อไปนี้
red apple
green apple
green apple
orange
orange
orange
มีคำสั่งหรือสคริปต์ Linux ที่ฉันสามารถใช้เพื่อรับผลลัพธ์ต่อไปนี้หรือไม่
1 red apple
2 green apple
3 orange
คำตอบ:
ส่งผ่านsort
(เพื่อรวมรายการที่อยู่ติดกันเข้าด้วยกัน) จากนั้นuniq -c
ให้นับเช่น:
sort filename | uniq -c
และเพื่อให้ได้รายการนั้นตามลำดับ (ตามความถี่) คุณสามารถทำได้
sort filename | uniq -c | sort -nr
เกือบจะเหมือนกับ borribles แต่ถ้าคุณเพิ่มd
พารามิเตอร์ลงไปuniq
จะแสดงเฉพาะรายการที่ซ้ำกัน
sort filename | uniq -cd | sort -nr
uniq -c file
และในกรณีที่ยังไม่ได้จัดเรียงไฟล์:
sort file | uniq -c
ลองทำตามนี้
cat myfile.txt| sort| uniq
cat <filename> | sort | uniq -c
คุณสามารถอยู่กับรายการเรียงตามตัวอักษร:
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
" ...
จะพิมพ์แอปเปิ้ลสองลูกประกบกล้วย.
เพื่อรับการนับ:
$> 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
นี่คือสคริปต์ 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))'
-d
โน้ตเล็ก ๆ น้อย ๆ