[Risolto] eliminare righe file come da righe secondo file
-
Luke Skywalker
- Prode Principiante
- Messaggi: 21
- Iscrizione: giovedì 7 gennaio 2016, 12:53
- Sesso: Maschile
[Risolto] eliminare righe file come da righe secondo file
ho due file, file1.txt e file2.txt
file1:
0 pippo
1 pippo
3 pippo
4 pippo
file2:
1 teso di esempio
4 testo di esempio
il risultato deve essere
file3:
1 pippo
4 pippo
in pratica voglio la prima e la quarta riga di file1 perchè in file2 ho solo la riga 1 e 4.
Come posso farlo nel modo più efficente e con il minor numero di righe in bash?
file1:
0 pippo
1 pippo
3 pippo
4 pippo
file2:
1 teso di esempio
4 testo di esempio
il risultato deve essere
file3:
1 pippo
4 pippo
in pratica voglio la prima e la quarta riga di file1 perchè in file2 ho solo la riga 1 e 4.
Come posso farlo nel modo più efficente e con il minor numero di righe in bash?
Ultima modifica di Luke Skywalker il mercoledì 17 maggio 2017, 15:41, modificato 1 volta in totale.
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: bash: eliminare righe file come da righe secondo file
Il modo più semplice è con awk, guarda qua:
http://forum.ubuntu-it.org/viewtopic.ph ... 7#p4978028
Basta cambiare i riferimenti al campo su '$1, e usare solo {print}; nel post successivo di Rai c'è la spiegazione.
Se vuoi scrivere su file basta usare la redirezione '> nome_file' a fine codice.
Altrimenti puoi greppare; in un ciclo while che legge un file, internamente si estrae il primo campo da ogni linea e si greppa sull'altro file.
Occhio alle regex, devi distinguere 1 da 10, 11....
La redirezione su file la fai allo stesso modo, a fine codice.
http://forum.ubuntu-it.org/viewtopic.ph ... 7#p4978028
Basta cambiare i riferimenti al campo su '$1, e usare solo {print}; nel post successivo di Rai c'è la spiegazione.
Se vuoi scrivere su file basta usare la redirezione '> nome_file' a fine codice.
Altrimenti puoi greppare; in un ciclo while che legge un file, internamente si estrae il primo campo da ogni linea e si greppa sull'altro file.
Occhio alle regex, devi distinguere 1 da 10, 11....
La redirezione su file la fai allo stesso modo, a fine codice.
Codice: Seleziona tutto
while read l;do
...
done < file2 > risultatoSalva l'Ucraina! 
-
Luke Skywalker
- Prode Principiante
- Messaggi: 21
- Iscrizione: giovedì 7 gennaio 2016, 12:53
- Sesso: Maschile
Re: bash: eliminare righe file come da righe secondo file
grazie della risposta. Il codice awk è proprio quello che cercavo. L'ho modificato nel seguente modo:
e ho ottenuto ciò che cercavo.
Metto risolto sul topic
Codice: Seleziona tutto
awk -F" " 'FNR==NR {a[$1]=$1; next} { if ($1 in a) {print}}' file2 file1>risultato.txtMetto risolto sul topic
-
Luke Skywalker
- Prode Principiante
- Messaggi: 21
- Iscrizione: giovedì 7 gennaio 2016, 12:53
- Sesso: Maschile
Re: bash: eliminare righe file come da righe secondo file
... a proposito ... quale è la procedura corretta per mettere [RISOLTO] in oggetto?
- UbuNuovo
- Imperturbabile Insigne

- Messaggi: 4457
- Iscrizione: sabato 12 dicembre 2009, 20:58
- Desktop: Mate
- Distribuzione: Ubuntu Mate 22.04.1 LTS
- Sesso: Maschile
- Contatti:
Re: bash: eliminare righe file come da righe secondo file
Ok, puoi eliminare '-F" "', gli spazi sono usati come separatore predefinito.
Visto che avevo provato anche con grep lo metto:
Per mettere [Risolto] basta inserirlo ad inizio titolo del tuo primo post (cliccando su Modifica).

Codice: Seleziona tutto
8-) awk 'FNR==NR {a[$1]=$1; next} { if ($1 in a) {print}}' file2 file1
1 pippo
4 pippoCodice: Seleziona tutto
while read l;do
s1=$(grep -Eo '^[0-9]+' <<< "$l")
grep "^$s1 " file1
done < file2 > risultatoSalva l'Ucraina! 
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti