2012-01-29 14 views
7

Ho letto il libro di ricette per Linux per farcela. Sono abbastanza nuovo ad esso.Concordanza del testo

I cam attraverso un argomento chiamato Concordanza del testo. Ora capisco di cosa si tratta, ma non sono in grado di ottenere una sequenza di comandi usando tr, sort e uniq (questo è ciò che dice il libro di cucina) che genererebbe la concordanza.

Qualcuno può dirmi come creare una concordanza di base? Ad esempio, ordina e visualizza la frequenza delle parole per ogni parola univoca.

L'idea presentata nel ricettario di utilizzare tr per tradurre tutti gli spazi in caratteri di nuova riga in modo che ogni parola vada in una nuova riga, che viene quindi passata al sorter e quindi passata a uniq con il flag -c a fare un conteggio dei termini unici.

Non sono in grado di calcolare i parametri corretti. Qualcuno può spiegare per favore spiegando cosa fa ogni parametro?

Ho cercato su google per questo, ma non sono in grado di ottenere una risposta chiaramente definita al mio problema.

Qualsiasi aiuto è molto apprezzato!

risposta

0
tr ' ' '\n' <input | sort | uniq -c 

Se ho capito bene il tuo commento, vuoi il totale di tutte le parole su tutti i file in una directory. Potete farlo in questo modo:

find mydir -type f -exec cat {} + | tr ' ' '\n' | sort | uniq -c 

find sarà ricorsivamente cercare mydir per i file che corrispondono i suoi argomenti: -type f dice di tenere solo file normali (al contrario di directory o un paio di altri tipi non si dovrebbe avere a preoccuparsi ancora), quindi find eseguirà cat, assegnandogli tutti i nomi di file come argomenti; cat concatena i file, stampandone tutti i contenuti come se fossero un unico file di grandi dimensioni. Quell'uscita passa quindi attraverso la stessa pipeline /uniq per calcolare effettivamente la concordanza.

+0

Devo correre ora (letteralmente) ma spiegherò quando torno se nessun altro lo fa. Nel frattempo, leggi le pagine man. – Kevin

+0

Grazie mille. Che funzioni. Proverò a decostruire e capire. –

+0

Ok. Capito. Una domanda però, possiamo estendere questo per fare una concordanza di alcuni file in una singola directory? Un modo per fare questo è archiviare l'output di "ls" in un file e quindi per ogni riga di quel file è un nome file, eseguire il comando sopra per aggiungere la concordanza di quel file in "result". Quindi fai di nuovo una concordanza sul "risultato". Funziona, ma esiste un modo più semplice ed elegante per realizzare questo? –

1

Ci sono molti modi per farlo, ma questa è la mia soluzione. Usa comandi diversi da quelli che hai menzionato, ma, attraverso l'uso di sed e un ordinamento finale, può produrre un output più desiderabile.

find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n 

find . -type f -print0 sarà ricorsivamente ricerca in tutte le cartelle ei file dalla directory corrente verso il basso. -type f restituirà solo i file. -print0 utilizzerà il carattere speciale \0 per terminare i nomi dei file in modo che gli spazi non confondano con il comando successivo nella pipe.

xargs prende input e lo trasforma in argomenti per un comando, in questo caso cat. cat stamperà il contenuto di tutti i file dati come argomenti. Lo -0 dice a xargs che il suo input è delimitato dal carattere speciale \0, non da spazi.

sed è un editor di flusso di pattern matching. Il primo comando sed sostituisce (s) tutti i segni di punteggiatura utilizzando lo schema [[:punct:]] e sostituisce la punteggiatura con niente. Corrisponde a tutti questi modelli in ciascuna riga assegnata (g).

Il secondo comando sed trasforma tutte le istanze di 1 o più spazi di fila (\s+) in nuove righe (\n) attraverso la stringa di input (g).

sort organizza le parole in ordine alfabetico.

uniq -c elimina i duplicati adiacenti nella lista di output mentre conta quanti ce n'erano.

sort -n ordina questa uscita numericamente restituendo un elenco di parole ordinate per frequenza di parola.

sed e xargs sono comandi molto potenti, soprattutto se utilizzati in combinazione. Ma, come un altro poster ha notato, find ha anche un potere quasi sfrenato. tr è utile, ma è più specifico di sed.

+0

Questo è fantastico! Grazie per la migliore funzionalità (oltre l'altra risposta). –