2013-03-15 21 views
10

Ho un file che contiene le informazioni in due colonne:pipe file riga per riga in più variabili di lettura

box1 a1 
box2 a2 

sto cercando di leggere questo file riga per riga in lettura e hanno ciascuno degli elementi pubblicitari essere messo in una variabile

al primo passaggio, $a conterrebbe box1 e $b conterrebbe a1.

Al secondo passaggio, $a conterrebbe box2 e $b conterrebbe a2, ecc

Un esempio del codice che sto usando per cercare di raggiungere è questo:

for i in text.txt; do 
    while read line; do 
    echo $line | read a b; 
    done < text.txt; 
    echo $a $b; 
done 

Questo dà me i seguenti risultati:

box1 a1 box2 a2 

Quando mi aspettavo i seguenti risultati:

box1 a1 
box2 a1 

Come posso risolvere questo problema?

risposta

27

Il piping in un comando read fa sì che le variabili vengano impostate in una sottoshell, che le rende inaccessibili (anzi, sono sparite) al resto del codice. In questo caso, però, non è nemmeno necessario il ciclo for o il secondo comando read:

while read -r a b; do 
    echo $a $b 
done < text.txt 
+0

Bingo! Ha funzionato come un fascino .. Grazie per la spiegazione, ha chiarito le cose per me. (@chepner e @Dave Jarvis .. Grazie!) – mlebel

+0

Se puoi avere '' 'nel tuo input, non dimenticare di usare l'argomento' -r' per leggere. – jfg956

+0

@jfgagne, ho ricercato -r e ho trovato quanto segue nei documenti di Oracle - "Per impostazione predefinita, a meno che non venga specificata l'opzione -r, il backslash (\\) funge da carattere di escape." è questo che intendevi? – mlebel

Problemi correlati