PDA

View Full Version : [c shell] comando sed


stella_650
23-06-2008, 17:11
ciao ragazzi, un aiutino per una questione da risolvere con uno script...
mi si chiede di contare le righe di due file, file1 e file2 ed eliminare le righe in eccesso in modo che i due file abbiano lo stesso numero di righe.
Ho realizzato una piccola funzione CONTELIMRIGHE.lib che:

-calcola il numero di righe del primo file
-calcola il numero di righe del secondo file
-calcola la differenza di righe del primo e del secondo file
-elimina le righe da 1 a diff di file1

Il problema è proprio nell'ultima istruzione, perchè quando vado ad eseguire nel mio script questa funzione, dopo il calcolo esatto di diff, ottengo questo error:

sed: -e expression #1, char 6: extra characters after command
cioè la notazione con 1,${diff}d non me l'accetta.



CONTELIMRIGHE()
{
riga1=`wc -l file1 | awk '{print $1}'`
riga2=`wc -l file2 | awk '{print $1}'`
echo "RIGHE file1 ---> $riga1"
echo "RIGHE file2 ---> $riga2"
diff=`expr $riga1 - $riga2`
echo "Differenza di righe tra i due file ---> $diff"
sed '1,${diff}d' file1


}

come posso fare?Esiste un'alternativa?o cosa devo correggere?
Grazie ...

DanieleC88
23-06-2008, 20:31
Hai usato virgolette singole, temo non faccia l'espansione in quel modo.

gepeppe
23-06-2008, 21:50
CONTELIMRIGHE()
{
riga1=$(wc -l file1 | awk '{print $1}')
riga2=$(wc -l file2 | awk '{print $1}')
echo "RIGHE file1 ---> $riga1"
echo "RIGHE file2 ---> $riga2"
diff=$(expr $riga1 - $riga2)
echo "Differenza di righe tra i due file ---> $diff"
sed '1,${diff}d' file1

}

che io ricordi, con sed non puoi contare le righe...potresti usare awk in questo modo:

awk -v m_diff="$diff" 'NR > m_diff { print $0 }' > file 1

cosi ti stampa tutte le riche in posizione maggiore di diff, e te le mette nel file 1 (sovrascrivendonolo!)

stella_650
24-06-2008, 07:43
Il problema non è contare le righe dei due file...perchè lo faccio con wc -l | awk per ottenere il numero; sed lo uso per eliminare le righe, cosa che m pare s possa fare.
Ora poichè devo cancellare le righe che vanno da 1 a diff, il cui valore è dato dalla differenza tra il numero di righe del primo file e il numero di righe del secondo file, mi occorre sapere come posso fare per ottenere quella istruzione...

stella_650
24-06-2008, 07:49
Hai usato virgolette singole, temo non faccia l'espansione in quel modo.

Non avevo letto questo messaggio....con le doppie virgolette funziona...grazie mille.