การนับจำนวนที่เกิดขึ้นในคอลัมน์แรกของไฟล์


8

เรามีไฟล์นี้:

1 2 
1 3
1 2
3 3
52 1
52 300

และอีก 1,000

ฉันต้องการนับจำนวนครั้งที่แต่ละค่าเกิดขึ้นในคอลัมน์แรก

1  3 
3  1
52 2

ซึ่งหมายความว่าเราเห็น 1 สามครั้ง.

ฉันจะทำสิ่งนั้นใน Perl, AWK หรือ Bash ได้อย่างไร


3
สวัสดี arashams! ฉันเห็นคุณเพิ่งถามคำถามที่คล้ายกันมากซึ่งทั้งหมดหมุนรอบหัวข้อเดียวกัน ฉันแน่ใจว่าชุมชนต้องการช่วยเหลือคุณ แต่บางทีคุณสามารถแสดงให้เราเห็นว่าคุณได้ลองอะไรมาบ้างและคุณติดอยู่ตรงไหน? เราต้องการให้ผู้คนแสดงความพยายามเล็กน้อยก่อนที่จะถามคำถามของพวกเขา - ไม่มีการเรียนรู้ใด ๆ ที่เกี่ยวข้องกับการเพียงแค่ขอให้ผู้อื่นให้รหัสสำหรับสิ่งที่เจาะจง ทำไมไม่บอกเราว่าพื้นหลังของเรื่องนี้คืออะไรกันแน่? อาจจะมีวิธีที่ง่ายกว่าในการบรรลุสิ่งที่คุณต้องการและเราไม่จำเป็นต้องหันไปใช้ตัวอย่างตัวอย่างกับตัวเลขนามธรรม
slhck

ขอบคุณสำหรับความช่วยเหลือของคุณ ฉันกำลังทำงานกับข้อมูล bgpdump และแยกวิเคราะห์
Arash

@slhck คุณแสดงความคิดเห็นสมควรได้รับไกลกว่า upvote ของฉันและอื่น ๆ !
pnuts

คำตอบ:


12

หากอินพุตถูกเรียงลำดับคุณสามารถใช้ uniq:

<infile cut -d' ' -f1 | uniq -c

ถ้าไม่ใช่ให้เรียงก่อน:

<infile cut -d' ' -f1 | sort -n | uniq -c

เอาท์พุท:

  3 1                                      
  1 3
  2 52

เอาท์พุทเป็นแลกเปลี่ยนเมื่อเทียบกับความต้องการของคุณคุณสามารถใช้ awk '{ print $2, $1 }' เพื่อเปลี่ยนสิ่งนั้น

1 3 
3 1
52 2

นอกจากนี้ยังมีสำนวน awk ซึ่งไม่จำเป็นต้องป้อนข้อมูลเรียง:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

เอาท์พุท:

1 3
52 2
3 1

เมื่อเอาต์พุตที่นี่มาจากแฮชจะไม่ถูกสั่งให้ส่งผ่าน sort -n ถ้าจำเป็น

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

หากคุณใช้ GNU awk คุณสามารถทำการเรียงลำดับจากภายใน awk:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

ในสองกรณีสุดท้ายผลลัพธ์คือ:

1 3
3 1
52 2

tnx .its ทำงาน :)
Arash

คุณช่วยอธิบายรหัสได้มั้ย awk '{h [$ 1] ++} END {สำหรับ (k in h) พิมพ์ k, h [k]}' | เรียงลำดับ -n
Arash

3
@arashams: {h[$1]++} บล็อกถูกประเมินสำหรับแต่ละบรรทัด h เป็นแฮชและ $1 เป็นคอลัมน์แรกและใช้เป็นกุญแจเข้า h. ดังนั้นสิ่งนี้นับว่าไม่ซ้ำกันบ่อยเพียงใด $1 จะเห็น END บล็อกถูกประหารชีวิตเมื่อสิ้นสุดการป้อนข้อมูลและพิมพ์ปุ่มและการนับ sort -n เรียงลำดับผลลัพธ์เป็นตัวเลข
Thor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.