Visualizzazione risultati 1 fino 6 di 6

Discussione: [scripting] spezzare delle sezioni di un file di testo

  1. #1
    Guest

    Predefinito [scripting] spezzare delle sezioni di un file di testo

    ciao,
    qualcuno riesce a farmi uno script che crei un file per ogni sezione racchiusa tra # # ?

    esempio:
    Codice:
    #inizio prima sezione. output:file 1
    blabla
    aeiou
    #inizio seconda sezione. output: file2
    ecco la seconda sezione...
    ...qwerty....
    #inizio terza sezione. output: file3
    #in questo caso c'è un altro commento. deve rimanere nella terza sezione
    #perché non ci sono righe non inizianti per #
    spero abbiate capito...
    #fine del file e della terza sezione

  2. #2
    L'avatar di radioradianti
    radioradianti non è connesso Utente storico
    Data registrazione
    26-11-2003
    Residenza
    Roma
    Messaggi
    1,000

    Talking

    Ciao Rommel,
    prova questo script.
    L'ho scritto al volo e commentato il più possibile, fammi sapere se ti va bene o se deve essere modificato.
    Per testarlo ho copiato quello che hai scritto e l'ho inserito all'interno di un file chiamato "test.txt".

    L'ho provato e mi genera tre file chiamati "sezione_1","sezione_2" e "sezione_3".

    Spero di aver capito bene come intendevi splittarli.


    #!/bin/bash
    #-----------------------------#
    #Titolo script : splitta.sh #
    #Autore : lemoeb #
    #Data : MAggio 2005 #
    #-----------------------------#

    #Definzione delle variabili
    #--------------------------
    i=1; #Utilizzata per contare le righe
    num_righe=`cat test.txt | wc -l`; #Numero delle righe file
    commento=0; #Identifica se il carattere letto è un commento
    num_file=0; #Numero progressivo sezione (nome File)

    #Stampa del messaggio di avvio e informazioni generiche
    #------------------------------------------------------
    echo "#### SPLITTA.SH ####";
    echo "--------------------";
    echo "Numero delle righe presenti nel file da splittare : "$num_righe;

    #Ciclo per analizzare tutte le righe del file
    #--------------------------------------------
    while (test $i -lt $num_righe)
    do

    #Recupero del primo carattere della righa e recupero della riga totale
    #---------------------------------------------------------------------
    primo_carattere=`cat test.txt | head -$i | tail -1 | awk '{ print substr($0,1,1) }'`;
    riga_totale=`cat test.txt | head -$i | tail -1 | awk '{ print $0 }'`;

    #Controllo se il primo carattere e' un commento e se la riga precedente era di commento
    #--------------------------------------------------------------------------------------
    if test $primo_carattere == "#" && test $commento -eq 0
    then

    #Mi salvo un valore per ricordarmi che la riga precedente era di commento
    #------------------------------------------------------------------------
    commento=1;

    #Incremento il numero del file
    #-----------------------------
    num_file=`expr $num_file + 1 `;

    #Compongo il nome del file
    #-------------------------
    nome_file="sezione_"$num_file;

    #creo il file
    >$nome_file;

    #Stampo a video la riga Totale elaborata
    #---------------------------------------
    echo $riga_totale;

    #Se il primo carattere non e' un commento scrivo nel file appena creato
    #la riga letta.
    #----------------------------------------------------------------------
    elif test $primo_carattere != "#"
    then

    #Scrittura della righa letta e settaggio del commento a 0
    #--------------------------------------------------------
    echo $riga_totale >> $nome_file;
    commento=0;

    #Se la riga letta e' di commento come la precedente allora continuo
    #a scrivere sul file creato
    #------------------------------------------------------------------
    elif test $primo_carattere == "#" && test $commento -eq 1
    then
    echo $riga_totale >> $nome_file;

    fi
    #Incremento della variabile per recuperare la riga dal file
    #----------------------------------------------------------
    i=`expr $i + 1`;
    done
    [EDIT]
    Ovviamente nella politica del FreeSoftware/Open Source puoi modificarlo a tuo piacimento e anche ridistribuirlo
    [/EDIT]


    Ciao

    Leandro

    Happy Slack!
    Ultima modifica di radioradianti : 20-05-2005 alle ore 11.54.00

    E' on line il numero 12 di Topolinux - Totalmente rinnovato!
    TopoLinux è anche chat! irc.azzurra.org canale #topolinux
    La semplicità di questo dono è inversamente proporzionale alla qualità della nostra amicizia

  3. #3
    Guest

    Predefinito

    complimenti!

    annotazioni:
    if test $primo_carattere == "#" && test $commento -eq 0
    elif test $primo_carattere != "#"
    elif test $primo_carattere == "#" && test $commento -eq 1

    dice expected unary operator a queste righe.

  4. #4
    L'avatar di radioradianti
    radioradianti non è connesso Utente storico
    Data registrazione
    26-11-2003
    Residenza
    Roma
    Messaggi
    1,000

    Predefinito

    Citazione Originalmente inviato da Rommel
    complimenti!

    annotazioni:
    if test $primo_carattere == "#" && test $commento -eq 0
    elif test $primo_carattere != "#"
    elif test $primo_carattere == "#" && test $commento -eq 1

    dice expected unary operator a queste righe.
    Il problema è dato dal fatto che nel file analizzato sono presenti delle righe di lunghezza 0.

    Ora sinceramente stò un pochino cotto, domani posto la modifica ed una spiegazione dettagliata dello script.

    Ciao

    Leandro

    Happy Slack!

    E' on line il numero 12 di Topolinux - Totalmente rinnovato!
    TopoLinux è anche chat! irc.azzurra.org canale #topolinux
    La semplicità di questo dono è inversamente proporzionale alla qualità della nostra amicizia

  5. #5
    L'avatar di radioradianti
    radioradianti non è connesso Utente storico
    Data registrazione
    26-11-2003
    Residenza
    Roma
    Messaggi
    1,000

    Predefinito

    Eccomi quà come promesso

    per ovviare all'inconveniente delle righe vuote che ti si presenta, basta sapere prima se la riga è vuota. :smile:

    Sempre tramite AWK, possiamo conoscere la lunghezza di una stringa in ingresso quindi aggiungeremo allo script :

    Nella definizione delle variabili
    lunghezza_riga=0;
    Nella sezione dove recuperiamo le info della riga
    lunghezza_riga=`cat test.txt | head -$i | tail -1 | awk '{ print length($0) }'`;
    ed infine prima di tutti gli IF presenti :
    if test $lunghezza_riga -gt 0
    then
    Da questo punto in poi lo script va lasciato invariato tranne per l'aggiunta di un nuovo "fi" prima dell'incremento della variabile "i".
    Serve per chiudere l' "IF" del controllo lunghezza riga.

    Lo script modificato è il seguente :

    #!/bin/bash
    #-----------------------------#
    #Titolo script : splitta.sh #
    #Autore : lemoeb #
    #Data : MAggio 2005 #
    #-----------------------------#

    #Definzione delle variabili
    #--------------------------
    i=1; #Utilizzata per contare le righe
    num_righe=`cat test.txt | wc -l`; #Numero delle righe file
    commento=0; #Identifica se il carattere letto è un commento
    num_file=0; #Numero progressivo sezione (nome File)
    lunghezza_riga=0; #Numero di caratteri che compongono la riga

    #Stampa del messaggio di avvio e informazioni generiche
    #------------------------------------------------------
    echo "#### SPLITTA.SH ####";
    echo "--------------------";
    echo "Numero delle righe presenti nel file da splittare : "$num_righe;

    #Ciclo per analizzare tutte le righe del file
    #--------------------------------------------
    while (test $i -lt $num_righe)
    do

    #Recupero del primo carattere della righa e recupero della riga totale
    #---------------------------------------------------------------------
    primo_carattere=`cat test.txt | head -$i | tail -1 | awk '{ print substr($0,1,1) }'`;
    riga_totale=`cat test.txt | head -$i | tail -1 | awk '{ print $0 }'`;
    lunghezza_riga=`cat test.txt | head -$i | tail -1 | awk '{ print length($0) }'`;

    #Entro nei controlli soltanto se la riga non e' vuota
    #----------------------------------------------------
    if test $lunghezza_riga -gt 0
    then

    #Controllo se il primo carattere e' un commento e se la riga precedente era di commento
    #--------------------------------------------------------------------------------------
    if test $primo_carattere == "#" && test $commento -eq 0
    then

    #Mi salvo un valore per ricordarmi che la riga precedente era di commento
    #------------------------------------------------------------------------
    commento=1;

    #Incremento il numero del file
    #-----------------------------
    num_file=`expr $num_file + 1 `;

    #Compongo il nome del file
    #-------------------------
    nome_file="sezione_"$num_file;

    #creo il file
    >$nome_file;

    #Stampo a video la riga Totale elaborata
    #---------------------------------------
    echo $riga_totale;

    #Se il primo carattere non e' un commento scrivo nel file appena creato
    #la riga letta.
    #----------------------------------------------------------------------
    elif test $primo_carattere != "#"
    then

    #Scrittura della righa letta e settaggio del commento a 0
    #--------------------------------------------------------
    echo $riga_totale >> $nome_file;
    commento=0;

    #Se la riga letta e' di commento come la precedente allora continuo
    #a scrivere sul file creato
    #------------------------------------------------------------------
    elif test $primo_carattere == "#" && test $commento -eq 1
    then
    echo $riga_totale >> $nome_file;

    fi
    fi
    #Incremento della variabile per recuperare la riga dal file
    #----------------------------------------------------------
    i=`expr $i + 1`;
    done
    Ultima cosa :
    Per eliminare totalmente i commenti dai vari file sezione_x
    basterà rimuovere le seguenti righe

    #Se la riga letta e' di commento come la precedente allora continuo
    #a scrivere sul file creato
    #------------------------------------------------------------------
    elif test $primo_carattere == "#" && test $commento -eq 1
    then
    echo $riga_totale >> $nome_file;
    Spero di essere stato utile, forse (anzi probabilmente) lo script che ho scritto può essere migliorato come tutte le idee e tutti i programmi, quindi Rommel ,se ti vuoi divertire........accomodati. :grin:


    Ciao

    Leandro

    Happy Slack!
    Ultima modifica di radioradianti : 20-05-2005 alle ore 12.10.31

    E' on line il numero 12 di Topolinux - Totalmente rinnovato!
    TopoLinux è anche chat! irc.azzurra.org canale #topolinux
    La semplicità di questo dono è inversamente proporzionale alla qualità della nostra amicizia

  6. #6
    Guest

    Predefinito

    utilissima spiegazione e altrettanto utile script! :winkOLD:

    grazie per la spiegazione.
    ciao

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •