ลบทุกบรรทัดที่ไม่มีอักขระ n ก่อนตัวคั่น


11

ฉันมีไฟล์ข้อความที่ยาวมาก (จากที่นี่ ) ซึ่งควรมีอักขระฐานสิบหก 6 ตัวและ 'ตัวแบ่ง' (ซึ่งปรากฏเป็นอักขระตัวเดียวและดูเหมือนจะไม่แสดงอย่างถูกต้องในการทำเครื่องหมายรหัสด้านล่าง) ตามด้วยคำสองสามคำ:

00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
5080    Cisco Systems, Inc
0E+00   ASUSTek COMPUTER INC.
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
2354    ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

ฉันได้ดูไปรอบ ๆ และไม่สามารถเห็นบางสิ่งที่จะทำงานได้ในสถานการณ์นี้ คำถามของฉันคือฉันจะใช้grep/ sed/ awk/ perlเพื่อลบบรรทัดทั้งหมดของไฟล์ข้อความที่ไม่ได้ขึ้นต้นด้วยตัวอักษรฐานสิบหก 6 ตัวจากนั้นเป็น 'ตัวแบ่ง' ได้อย่างไร

PS สำหรับคะแนนโบนัสวิธีใดที่ดีที่สุดในการจัดเรียงไฟล์ตามลำดับตัวอักษรและตัวเลขตามอักขระฐานสิบหก (เช่น000000-> FFFFFF) ฉันควรจะเพียงแค่ใช้sort?

คำตอบ:


13
$ awk '$1 ~ /^[[:xdigit:]]{6}$/' file
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

ใช้awkเพื่อแยกบรรทัดที่มีเลขฐานสิบหกหกหลักที่แน่นอนในฟิลด์แรก [[:xdigit:]]รูปแบบที่ตรงกับเลขฐานสิบหกบาทและ{6}ต้องใช้หกของพวกเขา เมื่อรวมกับจุดยึดกับจุดเริ่มต้นและจุดสิ้นสุดของฟิลด์ด้วย^และ$ตามลำดับสิ่งนี้จะจับคู่บนบรรทัดที่ต้องการเท่านั้น

เปลี่ยนเส้นทางไปยังไฟล์บางไฟล์เพื่อบันทึกภายใต้ชื่อใหม่

โปรดทราบว่านี้ดูเหมือนว่าจะทำงานร่วมกับ GNU awk(ที่พบทั่วไปในลินุกซ์) แต่ไม่ได้อยู่กับawkบนเช่น OpenBSD mawkหรือ


วิธีการที่คล้ายกันกับsed:

$ sed -n '/^[[:xdigit:]]\{6\}\>/p' file
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc

ในนิพจน์\>นี้ใช้เพื่อจับคู่จุดจบของเลขฐานสิบหก สิ่งนี้ทำให้มั่นใจได้ว่าจะไม่จับคู่หมายเลขที่ยาวขึ้น \>รูปแบบที่ตรงกับขอบเขตของคำคือช่องว่างความกว้างศูนย์ระหว่างตัวอักษรคำและอักขระที่ไม่ใช่คำพูด


สำหรับการเรียงลำดับข้อมูลผลลัพธ์ให้ทำการไพพ์รางผลลัพธ์sortหรือsort -fหากเลขฐานสิบหกของคุณใช้ทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก


1
สมบูรณ์แบบขอบคุณมาก สิ่งที่ฉันกำลังมองหา!
Rocco

8

และเพื่อความสมบูรณ์คุณสามารถทำได้ด้วย grep ด้วย:

$ grep -E '^[[:xdigit:]]{6}\b' oui.txt 
00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc
$ 

นิพจน์ grep แบบขยายนี้ค้นหาเลขฐานสิบหก 6 หลักที่จุดเริ่มต้นของแต่ละบรรทัดแล้วตามด้วยขอบเขตที่ไม่ใช่ whitespace-to-whitespace ( \b)

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