nodupt – un tool che migliora uniq

havetouched

Alle volte servono tools semplici, Linux li ha, ereditati da Unix, ma a volte serve personalizzarli. Ecco un esempio, perso.
Il mio caso è quello di voler eliminare le righe duplicate di uno stream, un file di testo, un .txt.
C’è il comando uniq ma nel mio caso non basta. Adesso vi conto.

Per visualizzare il file di dati (uno finto, creato per questo post, ma simile a quello reale) ricorro a uno script awk altrimenti non riesco a visualizzare i blanks. Lo script è lungo una riga (altre la shebang), questo, show:

#!/usr/bin/awk -f
{printf("*%s*\n", $0)}

Come si vede legge il/i files passatigli sulla riga di comando e li riscrive racchiudendo ogni riga tra due asterischi. Lo abilito ed ecco:

c0

Allora il file dup ha righe ripetute, non consecutive e con dei blanks (spazi e tabs) fuori posto. C’è il comando uniq ma non fa quello che voglio:

c1

Ma con Linux (e una volta Unix) è semplicissimo, ci sono riuscito anch’io, ecco nodupt:

#!/bin/bash
trimall $1 | nodup

che fa esattamente quello che mi serve:

c2

OK 😀 semplice vero?
😳 sì, avete ragione, dimenticavo 😳

nodupt è la concatenazione di due scripts, semplicissimi:

ecco trimall:

#!/usr/bin/awk -f
{$1=$1};1

e nodup:

#!/usr/bin/awk -f
!($0 in a){a[$0];print}

Come suggeriscono i nomi trimall elimina i blanks iniziali, finali e ridondanti tra i campi di ogni riga e passa l’output a nodup che elimina le righe duplicate.

Adesso un paio di confessioni: non è tutta farina del mio sacco.
Su awk prossimamente un post con tante ricette, lo sta preparando un mio giovane collaboratore (anzi, forse no, si farà un blog tutto suo, forse).
L’idea della concatenazione mi ha tormentato tutta la notte (afosa come non mai) per via che ieri ho scoperto questo post: Concatenative language.
Avendo tempo ci sarebbero parecchie idee qui. Chissà… 😉

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Trackback

  • AWK – raccolta di scripts – 2 | Ok, panico su 9 settembre 2016 alle 11:39

    […] Rimuove le righe duplicate, non consecutive awk '!a[$0]++' versione miliore awk '!($0 in a){a[$0];print}' attenti ai blanks finali, forse meglio trimmare prima; questo l’ho scriptato e lo uso, ne ho parlato qui. […]

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: