Xóa tất cả các dòng không có n ký tự trước dấu phân cách


11

Tôi có một tệp văn bản rất dài (từ đây ) nên chứa 6 ký tự thập lục phân sau đó là 'break' (xuất hiện dưới dạng một ký tự và dường như không hiển thị đúng trong phần đánh dấu mã bên dưới) kèm theo một vài từ:

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

Tôi đã thực hiện một số tìm kiếm xung quanh và không thể thấy một cái gì đó sẽ làm việc trong tình huống này. Câu hỏi của tôi là, làm thế nào tôi có thể sử dụng grep/ sed/ awk/ perlđể xóa tất cả các dòng của tệp văn bản này không bắt đầu bằng chính xác 6 ký tự thập lục phân và sau đó là 'ngắt'?

PS Đối với điểm thưởng, cách tốt nhất để sắp xếp tệp theo thứ tự chữ cái và số theo các ký tự hex (nghĩa là 000000-> FFFFFF) là gì? Tôi chỉ nên sử dụng sort?

Câu trả lời:


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

Điều này sử dụng awkđể trích xuất các dòng chứa chính xác sáu chữ số thập lục phân trong trường đầu tiên. Các [[:xdigit:]]mô hình phù hợp với một chữ số thập lục phân, và {6}đòi hỏi phải có sáu người. Cùng với việc neo vào đầu và cuối của trường với ^$tương ứng, điều này sẽ chỉ khớp trên các dòng mong muốn.

Chuyển hướng đến một số tập tin để lưu nó dưới một tên mới.

Lưu ý rằng điều này dường như hoạt động với GNU awk(thường thấy trên Linux), nhưng không phải với awkví dụ như OpenBSD, hoặc mawk.


Một cách tiếp cận tương tự với 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

Trong biểu thức này, \>được sử dụng để khớp với phần cuối của số thập lục phân. Điều này đảm bảo rằng các số dài hơn không được khớp. Các \>mô hình phù hợp với một ranh giới từ , tức là không gian zero-chiều rộng giữa một nhân vật từ và một nhân vật phi-word.


Để sắp xếp dữ liệu kết quả, chỉ cần đặt máng kết quả sorthoặc sort -fnếu số thập lục phân của bạn sử dụng cả chữ in hoa và chữ thường


1
Tuyệt, cảm ơn bạn nhiều. Chính xác những gì tôi đang tìm kiếm!
Rocco

8

Và để hoàn thiện, bạn cũng có thể làm điều này với 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
$ 

Biểu thức grep mở rộng này tìm kiếm chính xác 6 chữ số hex ở đầu mỗi dòng, ngay sau đó là một ranh giới không khoảng trắng đến khoảng trắng ( \b).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.