การนับจำนวนคำในไฟล์ข้อความ


31

ฉันมีไฟล์ข้อความที่มีทวีตและฉันจำเป็นต้องนับจำนวนครั้งที่มีการกล่าวถึงคำในทวีต ตัวอย่างเช่นไฟล์ประกอบด้วย:

Apple iPhone X is going to worth a fortune
The iPhone X is Apple's latest flagship iPhone. How will it pit against it's competitors?

และสมมติว่าฉันต้องการนับกี่ครั้งที่คำว่า iPhone ถูกกล่าวถึงในไฟล์ ดังนั้นนี่คือสิ่งที่ฉันได้ลอง

cut -f 1 Tweet_Data | grep -i "iPhone" | wc -l

มันใช้งานได้จริง แต่ฉันสับสนเกี่ยวกับคำสั่ง 'wc' ในยูนิกซ์ อะไรคือความแตกต่างถ้าฉันลองทำสิ่งที่ชอบ:

cut -f 1 Tweet_Data | grep -c "iPhone"

ใช้ -c แทนที่ไหน ทั้งสองอย่างนี้ให้ผลลัพธ์ที่แตกต่างกันในไฟล์ขนาดใหญ่ที่เต็มไปด้วยทวีตและฉันสับสนในการทำงาน วิธีใดเป็นวิธีที่ถูกต้องในการนับการเกิดขึ้น?


cut -f1กำลังตัดตามแท็บซึ่งไม่ได้ทำอะไรมากที่นี่ คุณแน่ใจหรือว่าwc -lให้จำนวนที่ถูกต้องกับคุณ มันจะแสดง 2 ที่นี่ แต่ฉันนับ "3" ของ iPhone
Jeff Schaller

เทคนิคอื่น: unix.stackexchange.com/q/39039/117549
Jeff Schaller

คำตอบ:


54

ด้วยความต้องการฉันจะใช้ grep GNU (สำหรับ-oตัวเลือก ) จากนั้นส่งผ่านwcไปเพื่อนับจำนวนการเกิดทั้งหมด:

$ grep -o -i iphone Tweet_Data | wc -l
3

ธรรมดาgrep -cบนข้อมูลจะนับจำนวนบรรทัดที่ตรงกันไม่ใช่จำนวนคำทั้งหมดที่ตรงกัน การใช้-oตัวเลือกจะบอก grep ให้แสดงผลลัพธ์การแข่งขันแต่ละรายการในบรรทัดไม่ว่ากี่ครั้งที่การแข่งขันอยู่ในบรรทัด

wc -lแจ้งให้wcโปรแกรมอรรถประโยชน์นับจำนวนบรรทัด หลังจาก grep ใส่แต่ละคู่ที่ตรงกันในบรรทัดของตัวเองนี่คือจำนวนการเกิดขึ้นทั้งหมดของคำในอินพุต


หาก GNU grep ไม่พร้อมใช้งาน (หรือต้องการ) คุณสามารถแปลงอินพุตด้วยtrเพื่อให้แต่ละคำอยู่ในบรรทัดของมันเองจากนั้นใช้grep -cในการนับ:

$ tr '[:space:]' '[\n*]' < Tweet_Data | grep -i -c iphone
3

1

วิธีที่ง่ายที่สุดคือ

grep -wc "your_text" FileName

สำหรับคุณมันจะเป็น

grep -wc "iPhone" Tweet_Data

คำตอบที่สะอาดมาก แต่ถ้าคุณจับคู่คำเช่น 'เท่ห์' คุณจะจับคู่เท่ห์และไม่ใช่ ccooll ดังนั้นโปรดระวังว่าการเว้นวรรครอบคำนั้นสำคัญ
jasonleonhard

1
ผลลัพธ์จะไม่ถูกต้องเมื่อคำนั้นเกิดขึ้นมากกว่าหนึ่งครั้งในบรรทัด
hek2mgl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.