AWK – raccolta di scripts – 2

nm5

Continuo da qui. Do per scontato (a differenza del post precedente) l’uso di files* e delle pipes.

Converte CR-LF in LF
utile per i file .txt di Windows. Personalmente ho creato lo script w2l e il corrispondente l2w. Gli editors di Linux non hanno in genere problemi a leggere i files di Windows. Cosa che capita invece di là se si usa l’orrendo Blocco note | Notepad. A volte è tragico 👿
awk '{sub(/\r$/,"")};1'
preferisco
sed 's/\r$//'g
oppure ancora meglio
tr -d "\r"

Converte LF in CR-LF
il complemento al precedente (l2w)
awk '{sub(/$/,"\r")};1'
preferisco
sed 's/$/\r/'g

Cancella spazi e tab iniziali (ltrim)
awk '{sub(/^[ \t]+/, "")};1'

Cancella spazi e tab finali (rtrim)
awk '{sub(/[ \t]+$/, "")};1'

Cancella spazi e tab iniziali e finali (trim)
awk '{gsub(/^[ \t]+|[ \t]+$/,"")};1'

Cancella spazi e tab iniziali e finali (trim) e spazi multipli tra i campi
awk '{$1=$1};1'

Inserisce 4 spazi allinizio della riga
awk '{sub(/^/, "    ")};1'
ma meglio
sed 's/^/    /'

Sostituisce “foo” con “bar” per ogni riga solo la prima istanza
awk '{sub(/foo/,"bar")}; 1'
meglio
sed 's/foo/bar/'

Sostituisce “foo” con “bar” per ogni riga solo la quarta istanza
occorre installare gawk
gawk '{$0=gensub(/foo/,"bar",4)}; 1'

Sostituisce “foo” con “bar” per ogni riga, tutte le istanze
awk '{gsub(/foo/,"bar")}; 1'
meglio
sed 's/foo/bar/g'

Sostituisce “foo” con “bar” solo se la riga contiene “baz”
vedi sopra per sub/gsub
awk '/baz/{gsub(/foo/, "bar")}; 1'

Sostituisce “foo” con “bar” solo se la riga non contiene “baz”
awk '!/baz/{gsub(/foo/, "bar")}; 1'

Sostituisce “alpha”, “beta” o “gamma” con “delta”
awk '{gsub(/alpha|beta|gamma/, "delta")}; 1'
meglio
sed -r 's/alpha|beta|gamma/delta/g'

Se la riga finisce con \ gli appende la successiva
fallisce con righe multiple terminanti con \ (ma basta rilanciarlo)
awk '/\\$/ {sub(/\\$/,""); getline t; print $0 t; next}; 1'

Scrive i nomi di tutti gli utenti
awk -F ":" '{print $1 | "sort" }' /etc/passwd

Scambia i campi #1 e 2 (generalizzabile ovviamente)
awk '{print $2, $1}'
oppure, più facile da ricordare
awk '{temp = $1; $1 = $2; $2 = temp}; {print}'

Cancella il campo 2
awk '{ $2 = ""; print }'

Scrive i campi in ordine inverso
awk '{for (i=NF; i>0; i--) printf("%s ",$i);print ""}'

Concatena ogni 3 righe separandole con virgola
awk 'ORS=NR%3?", ":"\n"'

Scrive le righe con il campo 3 uguale a OK
awk '$3 == "OK"'

Scrive le righe con il campo 3 diversi da OK
awk '$3 != "OK"'
o anche
awk '!($3 == "OK")'

Trova le rige che contengono A,  B e C in qualsiasi ordine
awk '/A/ && /B/ && /C/'

Trova le rige che contengono A, B e C in questo ordine
awk '/A.*B.*C/'

Righe più lunghe di 10 caratteri (sì tutti gli Unicode)
awk 'length > 10'

Scrive le righe da 2 a 4
awk 'NR==2,NR==4'

Scrive solo la riga 5
awk 'NR==5 {print;exit}'

Scrive solo le righe con una regexs specificata
awk '/questo/'

versione case-insensitive
awk 'BEGIN {IGNORECASE = 1} /questo/'

a3

Scrive solo le righe che non contengono la regex
awk '!/questa/'

Scrive da una regex alla fine del file
awk '/questa/,0'

Scrive le righe tra 2 regexs
awk '/inizio/,/fine/'

Scrive solo le righe non vuote come grep '.'; la seconda versione tiene buone anche quelle fatte da soli blanks (come grep)
awk NF
awk '/./'

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.

C’è ancora materiale da esaminare; purtroppo non elaborato dal mio giovane (ex?) collaboratore; dovrò farlo io, prossimamente 😉

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Trackback

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: