Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [bash] leggere un file riga per riga

    Salve

    In uno script bash come faccio a leggere un file riga per riga?

    Ho una file con una lista di file, uno per riga, con l'unico inconveniente che i nomi contengono degli spazi. Come faccio a fare un ciclo for sui file?

    Se faccio
    codice:
    for file in `cat ~/elenco_files.txt`; do
    ...
    done
    non funziona perchè spezza il nome del file.
    Come posso risolvere? :master:


    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    860
    prova così:

    codice:
    FILE=/percorso/nomefile
     for nomefile in $(cut -d: -f1 $FILE) do
      echo $nomefile
     done
    ovviamente modifica la struttura per la tua esigenza...
    ciao
    Linux Inside

  3. #3
    Non funziona

    Provo a spiegarmi meglio.
    Io ho un file tipo questo:
    codice:
    /dati/musica/David_Gilmour/On_an_Island/04 - Take_a_Breath.ogg
    /dati/musica/David_Gilmour/On_an_Island/06 - This_Heaven.ogg
    /dati/musica/David_Gilmour/On_an_Island/07 - Then_I_Close_My_Eyes.ogg
    /dati/musica/Depeche Mode/Playing the Angel/01 - A Pain That I'm Used To.ogg
    /dati/musica/Depeche Mode/Playing the Angel/02 - John the Revelator.ogg
    /dati/musica/Depeche Mode/Playing the Angel/04 - The Sinner in Me.ogg
    /dati/musica/Depeche Mode/Playing the Angel/08 - Nothing's Impossible.ogg
    /dati/musica/Depeche Mode/Playing the Angel/10 - Damaged People.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/01 - Stripped.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/02 - A_Question_of_Lust.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/04 - Strangelove.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/05 - Never_Let_Me_Down_Again.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/06 - Behind_the_Wheel.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/07 - Personal_Jesus.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/08 - Enjoy_the_Silence.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/09 - Policy_of_Truth.ogg
    /dati/musica/Depeche_Mode/The_Singles_86_98__disc_1_/10 - World_in_My_Eyes.ogg
    Come faccio a passare un file per volta con un ciclo for?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    860
    potresti fare così:

    NumeroRighe=$(/usr/bin/wc -l)

    a questo punto in numero righe sai di quante righe è composto il tuo file.

    inizi il ciclo for in maniera che parta dalla riga 0 alla riga numerorighe e mandi in echo... il risultato di per esempio

    riga = rigaattuale | awk ' { print $3 }'

    in questa maniera lui prende riga per riga e stampa solo il terzo gruppo che dovrebbe essere il nome del file...

    pò essere??
    Linux Inside

  5. #5
    Mmm.. vediamo :master:

    Comunque a me serve tutto il percorso, non solo il nome del file (credo di essermi spiegato male).. Dovrebbe essere più facile... forse :master:

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    860
    si allora è più facile...

    in breve molto grezzamente

    Numerorighe=$(/usr/bin/wc -l /percorso/file.txt)
    contariga=0
    for $Contariga == $numerorighe do
    contariga=$contariga+1
    echo -n /usr/bin/head -$Contariga /percorso/file.txt | /usr/bin/tail -1
    done

    al di la che devi rivedere il cilo for che ho improvvisato come sintassi..
    il resto ptrebbeessere corretto

    perchè tu parti da 0 e vai fino al numero di righe massimo di cui è composto il file e ogni volta visualizzi la riga in questione incrementando il contatore delle righe.

    ciao
    Linux Inside

  7. #7
    Grazie

    Ora provo

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    860
    no problem...

    se poi hai problemi basta che scrivi e vediamo di risolverli... se non ci si aiuta qui...
    Linux Inside

  9. #9
    Prova con
    codice:
    while read line
    do
    echo "${line}";
    done < tuofile.txt
    NeapoliX GNU/Linux
    "Alla maggior parte della gente piace leggere la propria scrittura e annusare l'odore dei propri peti." (Auden)

  10. #10
    Ok

    Ecco lo scriptino:
    codice:
    #!/bin/sh
    
    filename="playlist.txt"
    
    righe=$(wc -l $filename | awk '{print $1}')
    
    riga=0
    
    while [ $riga -lt $righe ]; do
        let riga+=1
        current=$(head -$riga $filename | tail -1)
        echo $current
    done
    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.