Premessa
Frequentando il forum italiano di ubuntu, succede spesso di incontrare utenti che chiedono aiuto alla comunità per implementare uno script in modo da poter automatizzare un determinato processo. Nel caso specifico veniva richiesta la possibilità di individuare e cancellare le righe doppie in uno script:
Ciao,
ho uno script (abbastanza lungo) e la necessità di verificare se questo contiene righe uguali. Come potrei fare?
Questa volta, siccome avevo un po di tempo libero da investire, ho deciso di rendermi utile fornendo il mio contributo alla comunità di Ubuntu in generale ed all’utente autore della richiesta in modo particolare; quindi mi sono rimesso a studiacchiare la Guida avanzata di scripting Bash ed ho provato a dare una soluzione al quesito sollevato.
Note:
In realtà lo script non cancella le righe doppie, ma le commenta solamente; questo perchè mi sembrava che dal punto di vista stilistico fosse più elegante ed inoltre è una soluzione molto meno drastica.
Lo script
#!/bin/bash
# Data : 25-07-2008
# Nome script: crd.sh
# Descrizione: commenta le righe doppie presenti in un file (escluso la prima trovata)
#————————————————————————————-# input utente
# faccio inserire all’utente il percorso e nome
# dei files (da elaborare e modificato).
clear
while [[ $pathFileOrig = “” ]]; do
echo -n “Digita il percorso seguito dal nome del file da elaborare: ”
read pathFileOrig
done
while [[ $pathFileMod = “” ]]; do
echo -n “Digita il percorso seguito dal nome del file modificato: ”
read pathFileMod
done# leggo quante righe ha il file e mi salvo il
# numero ottenuto nella variabile “tr”
tr=`wc -l $pathFileOrig | awk ‘{ print $1 }’`# inserisco il file originale in un array
# commentando le righe doppie successive
# alla prima trovata.
let i=1
let z=1
let j=1
while read riga
do
for j in `seq 1 $z`;do
if [ $i = “1” ]
then
array[i]=$riga
elif [[ $riga = “${array[j]}” ]]
then #se uguale
array[i]=’# ‘$riga
break
else #se diverso
array[i]=$riga
fi
done
let i=i+1
let z=i-1
done < $pathFileOrig# traferisco i dati presenti nell’array
# nel file “pathFileMod”
for u in `seq 1 $tr`
do
echo ${array[u]} >> $pathFileMod
done
Purtoppo l’indetazione è quello che è…
