Successivo: , Su: Programmi vari   [Contenuti][Indice]


11.3.1 Trovare parole duplicate in un documento

Un errore comune quando si scrive un testo lungo è quello di ripetere accidentalmente delle parole. Tipicamente lo si può vedere in testi del tipo “questo questo programma fa quanto segue…” Quando il testo è pubblicato in rete, spesso le parole duplicate sono poste tra il termine di una riga e l’inizio di un’altra, il che rende difficile scoprirle.

Questo programma, dupword.awk, legge un file una riga alla volta e cerca le occorrenze adiacenti della stessa parola. Conserva anche l’ultima parola di ogni riga (nella variabile precedente) per confrontarla con la prima parola sulla riga successiva.

Le prime due istruzioni fanno sì che la riga sia tutta in minuscolo, in modo che, per esempio, “Il” e “il” risultino essere la stessa parola. L’istruzione successiva sostituisce i caratteri che sono non alfanumerici e diversi dagli spazi bianchi con degli spazi, in modo che neppure la punteggiatura influenzi i confronti. I caratteri sono rimpiazzati da spazi in modo che i controlli di formattazione non creino parole prive di senso (p.es., l’espressione Texinfo ‘@code{NF}’ diventa ‘codeNF’, se ci si limita a eliminare la punteggiatura). Il record è poi suddiviso di nuovo in campi, producendo così solo la lista delle parole presenti sulla riga, esclusi eventuali campi nulli.

Se, dopo aver rimosso tutta la punteggiatura, non rimane alcun campo, il record corrente è saltato. In caso contrario, il programma esegue il ciclo per ogni parola, confrontandola con quella che la precede:

# dupword.awk --- trova parole duplicate in un testo
{
    $0 = tolower($0)
    gsub(/[^[:alnum:][:blank:]]/, " ");
    $0 = $0         # divide di nuovo in campi
    if (NF == 0)
        next
    if ($1 == prec)
        printf("%s:%d: duplicato %s\n",
            nome_file, FNR, $1)
    for (i = 2; i <= NF; i++)
        if ($i == $(i-1))
            printf("%s:%d: duplicato %s\n",
                nome_file, FNR, $i)
    prec = $NF
}

Successivo: , Su: Programmi vari   [Contenuti][Indice]