Elimina tutte le righe che non hanno n caratteri prima del delimitatore


11

Ho un file di testo molto lungo (da qui ) che dovrebbe contenere 6 caratteri esadecimali quindi una "pausa" (che appare come un carattere e non sembra apparire correttamente nel markdown del codice in basso) seguito da alcune parole:

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

Mi sono guardato intorno e non riesco a vedere qualcosa che funzioni in questa situazione. La mia domanda è: come posso usare grep/ sed/ awk/ perlper cancellare tutte le righe di questo file di testo che non iniziano esattamente con 6 caratteri esadecimali e quindi una "pausa"?

PS Per i punti bonus, qual è il modo migliore per ordinare il file in ordine alfabetico e numerico in base ai caratteri esadecimali (ovvero 000000-> FFFFFF)? Dovrei solo usare sort?

Risposte:


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

Questo utilizza awkper estrarre le righe che contengono esattamente sei cifre esadecimali nel primo campo. Il [[:xdigit:]]modello corrisponde a una cifra esadecimale e ne {6}richiede sei. Insieme all'ancoraggio all'inizio e alla fine del campo con ^e $rispettivamente, questo corrisponderà solo alle linee desiderate.

Reindirizzare a un file per salvarlo con un nuovo nome.

Si noti che questo sembra funzionare con GNU awk(che si trova comunemente su Linux), ma non con awkad esempio OpenBSD o mawk.


Un approccio simile con 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

In questa espressione, \>viene utilizzato per abbinare la fine del numero esadecimale. Ciò garantisce che non vengano abbinati numeri più lunghi . Il \>modello corrisponde a un limite di parole , ovvero lo spazio di larghezza zero tra un carattere di parola e un carattere di non parola.


Per ordinare i dati risultanti, inserisci semplicemente il trogolo dei risultati sorto sort -fse i tuoi numeri esadecimali utilizzano sia lettere maiuscole che minuscole


1
Perfetto, grazie mille. Esattamente quello che stavo cercando!
Rocco,

8

E per completezza, puoi farlo anche con 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
$ 

Questa espressione grep estesa cerca esattamente 6 cifre esadecimali all'inizio di ogni riga, seguite immediatamente da un confine da non spazio a spazio ( \b).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.