[Risolto] eliminare righe file come da righe secondo file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Luke Skywalker
Prode Principiante
Messaggi: 21
Iscrizione: giovedì 7 gennaio 2016, 12:53
Sesso: Maschile

[Risolto] eliminare righe file come da righe secondo file

Messaggio da Luke Skywalker »

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?
Ultima modifica di Luke Skywalker il mercoledì 17 maggio 2017, 15:41, modificato 1 volta in totale.
Avatar utente
UbuNuovo
Imperturbabile Insigne
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

Messaggio da UbuNuovo »

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.

Codice: Seleziona tutto

while read l;do
	...
done < file2 > risultato
Salva 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

Messaggio da Luke Skywalker »

grazie della risposta. Il codice awk è proprio quello che cercavo. L'ho modificato nel seguente modo:

Codice: Seleziona tutto

awk -F" " 'FNR==NR {a[$1]=$1; next} { if ($1 in a) {print}}' file2 file1>risultato.txt
e ho ottenuto ciò che cercavo.

Metto 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

Messaggio da Luke Skywalker »

... a proposito ... quale è la procedura corretta per mettere [RISOLTO] in oggetto?
Avatar utente
UbuNuovo
Imperturbabile Insigne
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

Messaggio da UbuNuovo »

Ok, puoi eliminare '-F" "', gli spazi sono usati come separatore predefinito.

Codice: Seleziona tutto

8-) awk 'FNR==NR {a[$1]=$1; next} { if ($1 in a) {print}}' file2 file1
1 pippo
4 pippo
Visto che avevo provato anche con grep lo metto:

Codice: Seleziona tutto

while read l;do
	s1=$(grep -Eo '^[0-9]+' <<< "$l")
	grep "^$s1 " file1 
done < file2 > risultato
Per mettere [Risolto] basta inserirlo ad inizio titolo del tuo primo post (cliccando su Modifica).
:ciao:
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti