[Risolto] eliminare righe file come da righe secondo file

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[Risolto] eliminare righe file come da righe secondo file

Messaggioda Luke Skywalker » giovedì 11 maggio 2017, 12:19

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.
Luke Skywalker
Prode Principiante
 
Messaggi: 12
Iscrizione: gennaio 2016
Sesso: Maschile

Re: bash: eliminare righe file come da righe secondo file

Messaggioda UbuNuovo » giovedì 11 maggio 2017, 16:30

Il modo più semplice è con awk, guarda qua:
viewtopic.php?f=33&t=620707#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
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2863
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile

Re: bash: eliminare righe file come da righe secondo file

Messaggioda Luke Skywalker » venerdì 12 maggio 2017, 10:24

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: 12
Iscrizione: gennaio 2016
Sesso: Maschile

Re: bash: eliminare righe file come da righe secondo file

Messaggioda Luke Skywalker » venerdì 12 maggio 2017, 10:34

... a proposito ... quale è la procedura corretta per mettere [RISOLTO] in oggetto?
Luke Skywalker
Prode Principiante
 
Messaggi: 12
Iscrizione: gennaio 2016
Sesso: Maschile

Re: bash: eliminare righe file come da righe secondo file

Messaggioda UbuNuovo » venerdì 12 maggio 2017, 10:36

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:
Nel caso in cui sia il primo a rispondere ad una richiesta di aiuto...chiunque abbia una soluzione migliore o anche solo diversa dalla mia è incoraggiato ad intervenire liberamente senza inviarmi alcun messaggio privato. In programmazione è basilare sapere che si può ottenere il medesimo risultato utilizzando metodi diversi.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2863
Iscrizione: dicembre 2009
Desktop: Mate
Distribuzione: Ubuntu 14.04
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 6 ospiti