Newsgroup: it.comp.os.linux.software
Titolo: Manipolare file con awk

Ho un problema, 
ho un file con tanti record ed ogni record è separato da questa sequenza:
"- (doppi apici e trattino). Avrei bisogno di fare in modo che ogni record 
sia su una singola riga. Con awk posso fare qualcosa tipo:
BEGIN { RS="-\"" }
{ print }
Il problema è che questo funziona bene con gawk ma con awk standard non 
funziona, infatti viene preso in considerazione solo il primo carattere di 
RS.
Come posso risolvere? 
Grazie mille,
  Luca
P.S. Vanno bene anche soluzioni diverse da awk, basta che siano portabili 
sui vari unix

 sui vari unix
Nn puoi compilare gawk sulla macchina dove deve girare lo script?
-- 
Bai bii,
Gianluca.
"Who knows where the road may lead us, only a fool would say"

sui vari unix
Puoi usare sed, per semplificare al massimo le cose. Se sei certo che la
sequenza -" occorra sempre e solo come separazione di record, questa
semplice espressione dovrebbe funzionare:
  s/-"/\
  /g
Devi proprio metterla su due righe (il '\' quota l'a-capo).
Potrebbe esserci qualche problema se nel file che devi trattare ci sono
righe molto lunghe (almeno 8192 byte secondo lo standard POSIX.2, ma alcune
implementazioni di sed arrivano solo a 4000).
Altrimenti puoi usare Perl, anche se e` come usare un cannone per colpire
una formichina:
$/ = '-"';
while (<>) {
	print;
}
Ciao.

Nn puoi compilare gawk sulla macchina dove deve girare lo script?
Potrei ma sarebbe piu' comodo mettere tutto in uno script di shell 
indipendente dalla piattaforma. 
Il problema è che facendo come mi hai detto ottengo questo errore:
awk: input record `"-A0000265          ...' too long
 source line number 1
che credo sia dovuto alla lunghezza delle righe che può essere anche 
qualche migliaio di carratteri.
Comunque grazie.

               Attenzione all'anti-spam XXX
Professor Capotta, sa cosa pensavo?  Che se Internet ha reso il mondo
grande come una palla da basket, in proporzione cos'e' diventato il suo
cervello?  Tornando a noi, me lo da' il trenta e lode?
		-- Walter Fontana

qualche migliaio di carratteri.
Perl non ha questo problema. E perche' non ha questo problema, e perche' le
righe vengono spezzate in corrispondenza del separatore di record.
Tutte le implementazioni di Perl si comportano allo stesso modo, su tutte
le piattaforme (anche al di fuori degli Unix-simili).
Perl e` un bel baraccone da portarsi dietro per un compito cosi` semplice
(anche se, volendo, si potrebbe installare solo il solo interprete, che di
per se' non e` enorme). Awk sarebbe stata una soluzione piu` leggera (un
programmino ad hoc in C sarebbe anche meglio, naturalmente, ma allora addio
portabilita` immediata; Java?).
Il codice Perl da me proposto (e non verificato) nel precedente messaggio
e` scorretto. Il seguente funziona:
    $/ = '-"';
    while (<>) {
        chomp();
        print $_, "\n";
    }
Ciao.

 }
Temo di non capire.
Ciao.

naturalmente, ma allora addio portabilita` immediata; Java?).
Il programmino in C ce l'ho gią. Solo che puntualmente mi dimentico di 
ricompilarlo e tentare di eseguire un programma compilato su HP-UX su un 
AIX non č bello ;-)))
Inoltre awk o sed nascono apposta per questo scopo e mi sembrava inutile 
scomodare il C.

               Attenzione all'anti-spam XXX
Bambino di 10 anni stermina l'intero staff del Telefono Azzurro con un
fucile a pompa.  Alla domanda: "Perche' lo hai fatto?", ha risposto:
"Perche' era sempre occupato!".
		-- Da it.hobby.umorismo

ovvero ogni volta che la prima parola ($0) contiene la stringa '-"'.
Questa e` una bella soluzione, ma per un altro problema, non per questo.
Ciao.

scomodare il C.
Perfettamente d'accordo!
Alla fine ho scritto una cosa in Awk che potrebbe anche funzionare. Non
garantisco, s'intende, nulla. Comunque, se ti serve ancora, prova a dare
un'occhiata al mio altro messaggio nel thread.
Ciao.

               Attenzione all'anti-spam XXX
Carabinieri:
- Perche' ti gratti la testa senza toglierti il cappello?
- Ma perche', tu quando ti gratti il sedere ti togli i pantaloni?
		-- Da it.hobby.umorismo

ma... non fa la stessa cosa?
Temo proprio di no.
Non si tratta di selezionare le righe in cui compare la stringa "-\""
(questo e` quello che fa il tuo programma), ma di dividere l'input in
corrispondenza della stringa "-\"".
Sono due compiti decisamente diversi.
A fronte di questo input:
 Uno-"Due-"Tre-"Quattro
il tuo programma produce:
 Uno-"Due-"Tre-"Quattro
Quello che si vuole venga prodotto e` invece:
 Uno
 Due
 Tre
 Quattro
Ciao.