นับค่าที่แตกต่างของฟิลด์ในไฟล์


17

ฉันมีไฟล์มีจำนวนบรรทัดมากกว่าล้านบรรทัด ในบรรทัดฉันมีเขตข้อมูลที่เรียกว่าtransactionidซึ่งมีค่าซ้ำ สิ่งที่ฉันต้องทำคือนับพวกเขาอย่างชัดเจน

ไม่ว่าจะมีค่าซ้ำกี่ครั้งก็ควรนับเพียงครั้งเดียว


มันจะง่ายกว่านี้ถ้าคุณสามารถให้รูปแบบของไฟล์ .. ไม่จำเป็นต้องเป็นข้อมูล
Nikhil Mulley

btw คุณต้องการให้ค่าถูกนับเป็น 1 โดยไม่คำนึงถึงจำนวนครั้งที่มีอยู่หรือคุณต้องการนับจำนวนครั้ง / การเกิดซ้ำหรือไม่ หากคุณเพียงต้องการให้นับหนึ่งครั้งค่าที่แตกต่างจะถูกนับอย่างไร คุณช่วยกรุณาตรวจสอบการแก้ไขของฉันในคำถามของคุณและยืนยันว่าฉันถูกต้องในการตีความ
Nikhil Mulley

@Nikhil คำถามนี้ชัดเจนจาก:... No matter of how many times a value is repeated, it should be counted as 1. ...

ตกลงแล้วคำตอบจาก @hesse จะทำตามความต้องการของคุณ
Nikhil Mulley

ขออภัยในความล่าช้า ฉันออกจากการเชื่อมต่ออินเทอร์เน็ต ตัวคั่นคือ 2 | ' และฟิลด์คือฟิลด์ 28 ฉันใช้ cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l ถ้าข้อสำหรับการตรวจสอบจากวันที่อื่นอย่างที่ดูเหมือนว่าเห็นได้ชัด :)
Olgun Kaya

คำตอบ:


23

ตกลงสมมติว่าไฟล์ของคุณเป็นไฟล์ข้อความโดยมีฟิลด์คั่นด้วยเครื่องหมายจุลภาคคั่น ',' คุณจะรู้ว่าฟิลด์'transactionid'ใดอยู่ในตำแหน่งของมัน สมมติว่า'transactionid'เขตข้อมูลของคุณเป็นเขตที่ 7

awk -F ',' '{print $7}' text_file | sort | uniq -c

สิ่งนี้จะนับการเกิดขึ้นที่แตกต่าง / ไม่ซ้ำกันในฟิลด์ที่ 7 และพิมพ์ผลลัพธ์


ทำไมsortก่อนuniqสั่ง
g10guang

@ g10guang กลายเป็นว่าuniqจะต้องกำจัดระเบียนที่พวกเขาต้องอยู่ติดกัน
dsz

3

อาจไม่ใช่วิธีที่ดีที่สุด แต่ควรใช้งานได้:

awk '{print $1}' your_file | sort | uniq | wc -l

โดยที่$1เป็นตัวเลขที่สอดคล้องกับฟิลด์ที่จะแยกวิเคราะห์


3

ไม่จำเป็นต้องเรียงลำดับไฟล์ .. ( uniqต้องการเรียงไฟล์)
สคริปต์ awk นี้ถือว่าฟิลด์เป็นฟิลด์ช่องว่างตัวแรก

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 

สำหรับไฟล์ขนาดใหญ่ (เช่นใกล้กับขนาด RAM) awk จะใช้หน่วยความจำจำนวนมาก sortการใช้งานส่วนใหญ่ได้รับการออกแบบมาเพื่อรับมือกับไฟล์ขนาดใหญ่ได้ดี
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.