Newsgroup: it.comp.os.linux.iniziare
Titolo: Bash script "variabili" ci sono quasi (solo questione di output)

Buongiorno a tutti.
Spero che voi tutti possiate darmi una mano!!! (please)
giuro che mi sono impegnato e che ho fatto n prove, ma proprio non
ottengo l'output che vorrei.
Mi spiego nel dettaglio:
Ho un file che qui chiamo FILE il quale contiene al suo interno un
listato nel formato ls -l (ovvero):
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
ora la mia necessità è quella di spezzettare la parte del nome file e
ricavarne un output del tipo:
AAA_bbb_111.222.333.444_SSS_STD
Lo script è questo:
#!/bin/sh
aaa=`cat FILE | awk -F. '{print $1}'|awk -F" " '{print $9}'`
bbb=`cat FILE | awk -F. '{print $2}'|awk -F_ '{print $1}'`
ccc=`cat FILE | awk -F. '{print $2}'|awk -F_ '{print
$2"."$3"."$4"."$5}'`
ddd=`cat FILE | awk -F. '{print $3}'`
APPOGGIO=`$aaa_$bbb_$ccc_$ddd`
echo Risultato: $APPOGGIO > registro_filtrato
La parte in awk se presa singolarmente, funziona (mi filtra quello che
voglio) e attribuisce la variabile correttamente. (infatti se io
faccio echo $aaa - mi esce tutto il listato di aaa)
IL problema è nel concatenamento delle variabili:
così com'è scritto nello script l'output che ricevo è del tipo:
aaa
aaa
aaa_
bbb
bbb
bbb_
ccc
ccc
ccc_
ddd
ddd
ddd
e non come lo vorrei io!!! :-(
Ho provato varie combinazioni (con le parentesi graffe, con &&, con le
tonde, con i doppi apici, etc etc).
Sareste così gentili da aiutarmi per favore :-)

 HAL 9000: Dave. Put down those Windows disks, Dave. DAVE!
Innanzi tutto grazie per la celere risposta.
se lancio il comando che mi hai dato tu l'output che mi da è il
seguente:
Risultato:
praticamente non mi da nulla :(

 [...]
Forse non ho ben capito, ma se il problema è togliere l'estensione
da un nome del tipo:
$ FILE=AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
perchè non usare
$ REGEXP=.data.tar.Z
$ echo ${FILE%$REGEXP}
Ciao, ClaudioT.

 The Microsoft Motto: "We're the leaders, wait for us!"
Ho fatto come hai fatto tu e ho:
cat lista.txt
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
sed 's|^.* \(.*\)\.data\.tar\.Z$|\1|' lista.txt
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
-rw-r--r--   1 pippo  other  808  Apr 26 01:00
AAA.bbb_111_222_333_444.SSS_STD.data.tar.Z
AAA.bbb_111_222_333_444.SSS_STD


No, perchè in ogni caso lo dovrei formattare diversamente.
infatti secondo la mia banale logica avevo pensato di passare ad X
variabili le scremature sulle porzioni del nome file che mi
interessano e poi fare una congiunnzione di tali valiabili passanto
l'output ad un file di registry che alla fine del gioco dovrebbe
contenere il listato ordinato per riga e formattato con la
concatenazione delle variabili: ovvero:
AAA.bbb_111_222_333_444.SSS_STD
AAA.bbb_111_222_333_444.SSS_STD
AAA.bbb_111_222_333_444.SSS_STD
...
AAA.bbb_111_222_333_444.SSS_STD

 Ciao, ClaudioT.
Piů precisamente...
$ IFS="
"
$ REGEXP=.data.tar.Z
$ echo "" > output.txt
$ for LINE in $(cat file.txt | grep $REGEXP)
 > do echo ${LINE%$REGEXP} >> output.txt
 > done
Ciao, ClaudioT.

 Ciao, ClaudioT.
a parte il doveroso ringraziamento :)
ho messo in script il tuo suggerimento ed il risultato è un file
output.txt formattato in questo modo:
-rw-r--r-- (questo non mi serve)
1           (questo non mi serve)
pippo     (questo non mi serve)
other     (questo non mi serve)
808       (questo non mi serve)
Apr       (questo non mi serve)
26        (questo non mi serve)
01:00    (questo non mi serve)
AAA.bbb_111_222_333_444.SSS_STD (questo mi serve però formattato nel
seg modo: AAA_bbb_111.222.333.444_SSS_STD )

 Named by Mike Andrews, defined by Rebecca Ore
si trova tutto sulla stessa linea
-rw-r--r--   1 pippo     other       1541 Apr 27 01:00
AAA.bbb_111_222_333_444.SSS_STD.2007-04-27_tar.Z
ho messo anche la data ora e giuro che ho fatto il copia incolla
(ovviamente sostituendo i dati sensibili )
scusatemi se vi sto tediando ma pensavo fosse più facile ottenere
quello che volevo con un semplice script.
pensavo che la messa in variabili con awk correttamente parametrizzato
per ogni singola sezione del nome all'interno del file ed eseguendo
una concatenazione delle variabili avrei risolto.
Il problema non è nell'estrarre la porzione che m'interessa (quella
con awk la ottengo!)
il problema è che non riesco a concatenare :(
infatti mi da l'output in verticale, invece io lo vorrei in
orizzontale (riga per riga)
NO:
aaa
aaa_
bbb
bbb_
ccc
ccc_
ddd
ddd
MI PIACEREBBE TANTO :)
aaa_bbb_ccc_ddd
scusate ancora ;)

 AAA_bbb_111.222.333.444_SSS_STD
              ^       ^   ^
Non avevo notato.
Appena ho un momento più libero rileggo bene il primo post e ci penso
(ma mi sa che l'aiuto di Davide Bianchi è più efficace).
Ciao, ClaudioT.

    for every light bulb ever changed anywhere in the world.
ciao

cut -c 48-80 input_file > output_file
Funzionerebbe soltanto se il formato del
nome del file ha una lunghezza fissa e 
non trovo che sia molto elegante.
Comunque non avrebbe nuociuto dare 
informazioni scritte sul formato del nome 
dei file piuttosto che lasciarlo indovinare
al lettore.


Grazie ma al CUT ci avevo pensato anche io.
cmq visto che volete questo benedetto estratto... eccovene una
porzione:
considerate cmq che ci sono circa un 500 linee. (ma tanto ve ne basta
un pezzo... gisto?)
-rw-r--r--   1 root     other        237 Apr 24 01:00
OMFTESERNTT.bwkmd_113_211_81_90.SIST_STANDARD.2007-04-24_01-00.Z
-rw-r--r--   1 root     other        726 Apr 24 01:00
OMFTESERNTT.rmfdas_113_210_8_85.SET_STANDARD.2007-04-24_01-00.tar.Z
-rw-r--r--   1 root     other          3 Apr 25 01:00
OMFTESERNTT.tokmesq_113_210_49_92.SIST_STANDARD.2007-04-25_01-00.Z
-rw-r--r--   1 root     other        253 Apr 25 01:00
OMFTESERNTT.rmkmaa_113_210_8_85.SIST_STANDARD.2007-04-25_01-00.Z
-rw-r--r--   1 root     other       1609 Apr 25 01:00
OMFTESERNTT.masa_113_211_81_90.SET_STANDARD.2007-04-25_01-00.tar.Z
-rw-r--r--   1 root     other          3 Apr 25 01:00
OMFTESERNTT.bokmas_113_211_81_90.SIST_STANDARD.2007-04-25_01-00.Z
-rw-r--r--   1 root     other       1347 Apr 25 01:00
OMFTESERNTT.omas_113_210_49_92.SET_STANDARD.2007-04-25_01-00.tar.Z
da questo vorrei ottenere un file così filtrato ad es:
OMFTESERNTT_bwkmd_113.211.81.90_SIST_STANDARD
OMFTESERNTT_rmfdas_113.210.8.85_SET_STANDARD
OMFTESERNTT_tokmesq_113.210.49.92_SIST_STANDARD
OMFTESERNTT_rmkmaa_113.210.8.85_SIST_STANDARD
OMFTESERNTT_masa_113.211.81.90-SET_STANDARD
OMFTESERNTT_bokmas_113.211.81.90_SIST_STANDARD
OMFTESERNTT_omas_113.210.49.92_SET_STANDARD
da notare che vi è anche una sostituzione di alcuni caratteri _ e .
infatti in principio il nome è:
OMFTESERNTT.omas_113_210_49_92.SET_STANDARD.2007-04-25_01-00.tar.Z
mentre una volta filtrato diventa:
OMFTESERNTT_omas_113.210.49.92_SET_STANDARD
Spero di essere stato chiaro questa volta.
e cmq scusatemi ma è il primo posto nel NG.

 e cmq scusatemi ma č il primo posto nel NG.
tutto su una riga da cat in poi.
#!/bin/sh
FILE=./nomefile
cat $FILE | sed -e 's|^.* \(.*STANDARD\)|\1|' -e 's|\.\([A-Za-z]\)|_\1
g' -e 's|\([0-9]\)_\([0-9]\)|\1\.\2|g' - > registro_filtrato

 listato nel formato ls -l (ovvero):
Domanda : questo file lo produci te con appunto ls -l > nomefile o e' un
prodotto 'di terze parti'? Perche' nel caso ti basterebbe usare ls -1 >
nomefile , cosi' da scremare in partenza quello che non ti interessa.
-- 
Ciao.
Alessandro 
"Ubuntu" - an African word, meaning "Slackware is too hard for me".

 e cmq scusatemi ma è il primo posto nel NG.
Ti pare!
Comunque gli errori non sono stati solo da parte tua.

 ma non  è cosi' semplice.
per la cronaca: sarebbe stato:
sed 's/^.*\(OMF.*STANDARD\).*$/\1/
     y/./_/
     s/\([0-9]\)_\([0-9]\)/\1.\2/g' input_file > output_file
Ora hai molti modi diversi per fare la stessa cosa ;)

 cosi' da scremare...
basta:
ls > nomefile

 ma non  è cosi' semplice.
Ovviamente intendevo: "Fare tutto il lavoro con sed..."
ma resta comunque un mio errore :(

 g' -e 's|\([0-9]\)_\([0-9]\)|\1\.\2|g' - > registro_filtrato
non funziona quando nell'ottetto c'è una cifra sola, quindi copio dal
vicino:
#!/bin/sh
FILE=./nomefile
sed -e 's|^.* \(.*STANDARD\).*|\1|' -e 's|\.\([A-Za-z]\)|_\1|g' -e 's
\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\)_\([0-9]\+\)|\1.\2.\3.\4|' $FILE >
registro_filtrato

mallin.shetland wrote:

..che non e' la stessa cosa.
E in entrambi i casi non sarebbe male far precedre il tutto da 
LS_OPTIONS='';


 tutto da LS_OPTIONS='';
Perche` non dirlo prima?

 Perche` non dirlo prima?
Perche' mi e' venuto in mente dopo.
