[Risolto]Sostituzione di zeri con spazi mantenendo formattaz

Bash, Perl, Python, Ruby, ...

[Risolto]Sostituzione di zeri con spazi mantenendo formattaz

Messaggioda Bileygr » 27/12/2015, 22:46

Ciao, come da titolo avrei bisogno di sostituire degli zeri con degli spazi mantenendo l' allineamento del file. Mi spiego meglio con un esempio:

Io ho:

12345
45689
00321
02100

cioè una riga che inizia con uno spazio + 5 numeri. Io dovrei togliere gli zeri davanti in modo che la sequenza diventi

12345
45689
321
2100

Dal testo non si vede perché non vengono usati i caratteri monospace, però in pratica nella terza riga deve togliere i 2 zeri davanti sostituendoli con 2 spazi (quindi deve venire spazio+2 spazi+321), nella quarta deve togliere il solo zero che c' è davanti sostituendolo con uno spazio (quindi deve venire spazio+1 spazio+2100). Con sed l' espressione regolare per individuare il pattern è:

Codice: Seleziona tutto
sed "s/^ 00*/


però mi manca la parte finale, in pratica come dirgli "se hai tolto 3 zeri metti 3 spazi, se ne hai tolti 2 metti 2 spazi, ecc...

Ovviamente visto che le sequenze sono di 5 numeri oltre al primo spazio potrei fargli fare la cosa 4 volte togliendo ogni volta uno zero, però cercavo il comando più furbo che mi permettesse di farlo in un colpo solo.

Grazie mille
Ultima modifica di Bileygr il 05/01/2016, 20:54, modificato 1 volta in totale.
Bileygr
Full Member
Full Member
 
Messaggi: 136
Iscritto il: 02/02/2015, 14:22

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda marko_95 » 02/01/2016, 12:11

Ciao! Forse (anzi, sicuramente) non è la soluzione migliore, più veloce o quella che cercavi, pero' quando ho da fare questi lavori (raramente), mi piace ingegnarmi con Python (non so usare sed, awk e le re in generale xD).
Ecco cosa ho fatto:
Codice: Seleziona tutto
marko-95@iMac-deb:~/Desktop$ cat file.txt
 12345
 45689
 00321
 02100
 04353
 00048
 36000
 30505
 00007
 03532
marko-95@iMac-deb:~/Desktop$ python
Python 2.7.9 (default, Mar  1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> with open("file.txt", "r") as f:
...     number = f.read().splitlines()
...     f.close()
...
>>> out = []
>>> for n in number:
...     n = n[1:]
...     new_n = []
...     i = 0
...     while n[i] == "0":
...             new_n.append(" ")
...             i += 1
...     new_n.append(n[i:])
...     out.append(new_n)
...
>>> for i in range(0, len(out)):
...     out[i] = " " + "".join(out[i])
...
>>> out
[' 12345', ' 45689', '   321', '  2100', '  4353', '    48', ' 36000', ' 30505', '     7', '  3532']
>>> with open("file.txt", "w") as f:
...     for n in out:
...             f.write(n + "\n")
...     f.close()
...
>>> quit()
marko-95@iMac-deb:~/Desktop$ cat file.txt
 12345
 45689
   321
  2100
  4353
    48
 36000
 30505
     7
  3532
marko-95@iMac-deb:~/Desktop$

Se ti serve per più di un file, ovviamente puoi mettere tutto in una funzioncina da chiamare all'occorrenza. Se hai intenzione di usarlo con file importanti, mi raccomando, fai delle prove prima!
Spero di aver capito bene il problema e di esserti stato di aiuto!
Avatar utente
marko_95
Jr. Member
Jr. Member
 
Messaggi: 78
Iscritto il: 11/05/2015, 16:14

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda wtf » 02/01/2016, 16:13

Codice: Seleziona tutto
sed ':l s/^ \([ ]*\)0/ \1 /;tl'


Vedi questa pagina.

EDIT: Ops, mi sono accorto solo ora che non è quello che volevi tu. Il codice che ho inserito io allinea a destra e non a sinistra. Quello che segue dovrebbe fare al caso tuo:
Codice: Seleziona tutto
sed 's/^ 0\+/ /g'

La -r serve per usare il +.
Cose da sapere:
Avatar utente
wtf
Global Moderator
Global Moderator
 
Messaggi: 725
Iscritto il: 12/04/2011, 10:58

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda nydebianized » 02/01/2016, 20:34

Codice: Seleziona tutto
tr -s '0'  ' ' < filedamodificare > filerisultante
dd if=/dev/brain of=/dev/head
Avatar utente
nydebianized
Sr. Member
Sr. Member
 
Messaggi: 338
Iscritto il: 08/11/2006, 4:43

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda wtf » 02/01/2016, 20:41

@ndebianized
A me elimina tutti gli zeri, non solo quelli iniziali.
Cose da sapere:
Avatar utente
wtf
Global Moderator
Global Moderator
 
Messaggi: 725
Iscritto il: 12/04/2011, 10:58

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda nydebianized » 02/01/2016, 21:37

Non era questo lo scopo ? eliminare gli zeri e sostituirli con degli spazi?
dd if=/dev/brain of=/dev/head
Avatar utente
nydebianized
Sr. Member
Sr. Member
 
Messaggi: 338
Iscritto il: 08/11/2006, 4:43

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda nydebianized » 02/01/2016, 21:49

se deve eliminare solo gli zeri iniziali e sostituire con uno spazio allora sarebbe meglio

Codice: Seleziona tutto
sed "s/^0/ /"  <filedamodificare > filerisultante


ma questo rimuove solo il primo zero
dd if=/dev/brain of=/dev/head
Avatar utente
nydebianized
Sr. Member
Sr. Member
 
Messaggi: 338
Iscritto il: 08/11/2006, 4:43

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda nydebianized » 03/01/2016, 2:03

ok ok... non ci riuscivo a dormire sopra:

assumendo da quanto scritto nel primo post:

se il numero massimo di cifre è 5, allora:

Codice: Seleziona tutto
awk '{$1=sprintf("%5d", $1)} 1' filediorigine > filecorretto
dd if=/dev/brain of=/dev/head
Avatar utente
nydebianized
Sr. Member
Sr. Member
 
Messaggi: 338
Iscritto il: 08/11/2006, 4:43

Re: Sostituzione di zeri con spazi mantenendo formattazione

Messaggioda Bileygr » 05/01/2016, 20:53

Ringrazio tutti quelli che mi hanno risposto:

@marko95
ti ringrazio per il programma in python però io volevo proprio trovare il modo di farlo da shell. Perchè a me per lavoro spesso capita di dover fare "magheggi" del genere con files scaricati da mainframe, ma ogni volta devo fare qualcosa di leggermente diverso, quindi mi serviva proprio un metodo "spiccio" da fare al volo al momento

@wtf
dall' esempio che ho fatto non si vedeva perchè postando perde l' allineamento, però come ho scritto sotto a me quello che serviva era proprio l' allineamento a destra, in pratica togliere gli zeri senza spostare nulla.
Il primo comando che hai scritto fa esattamente quello che volevo io, grazie mille!!!

@nydebianized
la stringa con awk funziona perfettamente, però ha il problema che se nel file c' è una qualche stringa alfanumerica che non sia spazio+numero da 5 cifre me la pialla completamente e la trasforma in zero. Questo però non lo avevo detto.

Comunque metto risolto nel post iniziale.

Grazie a tutti
Bileygr
Full Member
Full Member
 
Messaggi: 136
Iscritto il: 02/02/2015, 14:22


Torna a Scripting

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti

cron