Conteggio delle occorrenze nella prima colonna di un file


9

Abbiamo questo file:

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

e altri 1000.

Voglio contare il numero di volte in cui si verifica ciascun valore nella prima colonna.

1  3 
3  1
52 2

Questo significa che abbiamo visto 1tre volte.

Come posso farlo, in Perl, AWK o Bash?


3
Ciao arashams! Di recente ti ho visto porre domande molto simili che ruotano tutte intorno allo stesso argomento. Sono sicuro che la community vorrebbe aiutarti, ma forse potresti mostrarci cosa hai già provato e dove esattamente sei rimasto bloccato? Richiediamo alle persone di mostrare un piccolo sforzo prima di porre le loro domande: non è necessario alcun apprendimento dal chiedere semplicemente agli altri di darti il ​​codice per una cosa specifica. Perché non dirci qual è esattamente lo sfondo di questo? Forse c'è un modo più semplice per realizzare ciò che vuoi e non abbiamo bisogno di ricorrere a esempi fittizi con alcuni numeri astratti?
slhck,

grazie per il tuo aiuto. sto lavorando con i dati di bgpdump e analizzandoli.
Arash,

Risposte:


12

Se l'input è ordinato, è possibile utilizzare uniq:

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

In caso contrario, ordinalo prima:

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

Produzione:

  3 1                                      
  1 3
  2 52

L'output viene scambiato rispetto alle tue esigenze, puoi usarlo awk '{ print $2, $1 }'per cambiarlo.

1 3 
3 1
52 2

C'è anche il linguaggio awk, che non richiede input ordinati:

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

Produzione:

1 3
52 2
3 1

Poiché l'output qui proviene da un hash non verrà ordinato, passare a sort -nse necessario:

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

Se stai usando GNU awk, puoi fare l'ordinamento da awk:

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

Negli ultimi due casi l'output è:

1 3
3 1
52 2

tnx .its ha funzionato :)
Arash il

potresti spiegare il codice ??? awk '{h [$ 1] ++} END {per (k in h) stampa k, h [k]}' | sort -n
Arash,

3
@arashams: il {h[$1]++}blocco viene valutato per ogni riga. hè un hash ed $1è la prima colonna e utilizzata come chiave in h. Quindi questo spiega quanto spesso $1vengono visti gli unici . Il ENDblocco viene eseguito alla fine dell'input e stampa i tasti e i conteggi. sort -nordina l'uscita numericamente.
Thor,
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.