[Risolto] Modifica valore colonna file in BASH

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

[Risolto] Modifica valore colonna file in BASH

Messaggio da cloudany »

Ciao a tutti, espongo il mio problema ho un file contenente una serie di colonne dove ognuna di esse ha un determinato valore, nel mio caso la 6 colonna è quella che dovrei modificare cioè prendo la sesta colonna e sostituisco -9 con un valore diverso, purtroppo Libreoffice Calc non mi viene in aiuto dato che mi dice che ci sono troppe colonne per ciò quando vado a salvare esso mi "taglia" parte del file e non posso perdere dati, mi aiutereste?
Ultima modifica di cloudany il sabato 21 giugno 2014, 12:43, modificato 1 volta in totale.
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Modifica valore colonna file in BASH

Messaggio da vaeVictis »

Vediamo che si può fare :)
Ma come ieri... spiegati meglio, sennò andiamo incontro a errori evitabili ;)

Quindi... spiega un po' meglio al struttura di questo file e cosa precisamente devi fare.
(Anche i comandi che dai e gli errori che riporti sarebbe interessante vederli)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

Ciao carissimo , allora il mio file contiene:

Codice: Seleziona tutto

2427    NA19919 NA19908 NA19909 1 -9   
2528    NA19920 NA19909 NA19910 1 -9 e così via
Devo sostituire il -9 con il valore che scelgo io dovrebbe risultare così quindi:

Codice: Seleziona tutto

2427    NA19919 NA19908 NA19909 1 ASW   
2528    NA19920 NA19909 NA19910 1 ASW e così via
Di codice provo ma sono in un pantano per cui non so dove iniziare...
" 4 letters are enough to explain mankind"
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

prova

Codice: Seleziona tutto

awk '{ if ($6 == "-9") $6="ASW"; print }' nome_file
Salva l'Ucraina! 🇺🇦
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

Si avevo provato anche io così ma:

Codice: Seleziona tutto

awk: program limit exceeded: maximum number of fields size=32767
P.s. le modifiche andrebbero salvate sullo stesso file che ho aperto.
Ultima modifica di cloudany il venerdì 20 giugno 2014, 14:14, modificato 1 volta in totale.
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Modifica valore colonna file in BASH

Messaggio da vaeVictis »

Se il problema è analogo a quello di ieri, ha un numero di campi che manda in cappella awk.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

Qundi devi usare cut...
Già devi mantenere tutti i campi.
Vae te che sei un esperto di sed...
Salva l'Ucraina! 🇺🇦
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

UbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603081#p4603081][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Qundi devi usare cut...
Già devi mantenere tutti i campi.
Vae te che sei un esperto di sed...
Infatti devo solo modificare il 6 campo per tutte le righe mantenendo le altre colonne e righe
" 4 letters are enough to explain mankind"
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

Bisognerebbe spezzare il file alle date colonne, utilizzare awk e poi rimontare il file...ma?
Provo a pensarci un po.
VaeVictis come faresti?
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Modifica valore colonna file in BASH

Messaggio da vaeVictis »

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg SESTOCAMPO"  | sed 's/^\([^\s]* [^\s]* [^\s]* [^\s]* [^\s]*\) \([^\s]*\)/\1 BUMBUM-STALLMAN/'
1234 1234 1234 1234 lkhjg BUMBUM-STALLMAN
Non ho tempo di capire usare i moltiplicatori per eliminare quello schifo di ripetizioni.
E non so neanche se funziona (l'ho fatto al volo, ma devo rimettermi a piangere)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

Provo così:

Codice: Seleziona tutto

cat hapmap3_r2_b36_fwd.ASW.qc.poly.ped | cut -c1-100 | awk '{ if ($6 == "-9") $6="ASW"; print }' > test.txt
Ma nel test.txt perdo informazioni cioè il resto delle colonne, comunque ripeto devo modificare il file non scrivere su uno nuovo, ora l ho fatto per provare (e meno male!)
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Modifica valore colonna file in BASH

Messaggio da vaeVictis »

Anzi no, il tempo ce l'ho :)

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg SESTOCAMPO"  | sed -r 's/^(([^\s]* ){5})([^\s]*)/\1 -BUMBUM-STALLMAN- /'
1234 1234 1234 1234 lkhjg  -BUMBUM-STALLMAN- 
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

Se non ci sono limitazioni dovrebbe andare bene! C'è solo da aggiungere uno spazio al campo sostituito.

Codice: Seleziona tutto

8-) echo "1234 1234 1234 1234 lkhjg SESTOCAMPO settimo ottavo"  | sed 's/^\([^\s]* [^\s]* [^\s]* [^\s]* [^\s]*\) \([^\s]*\)/\1 BUMBUM-STALLMAN/'
1234 1234 1234 1234 lkhjg SESTOCAMPO BUMBUM-STALLMANsettimo ottavo
edit: non avevo visto la nuova versione, grande Vae
Ultima modifica di UbuNuovo il venerdì 20 giugno 2014, 14:53, modificato 1 volta in totale.
Salva l'Ucraina! 🇺🇦
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

vaeVictis [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603104#p4603104][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Anzi no, il tempo ce l'ho :)

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg SESTOCAMPO"  | sed -r 's/^(([^\s]* ){5})([^\s]*)/\1 -BUMBUM-STALLMAN- /'
1234 1234 1234 1234 lkhjg  -BUMBUM-STALLMAN- 
Andrebbe bene ma mi restituisce sul terminale se apro il file sempre -9 mi ritrovo :(
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Modifica valore colonna file in BASH

Messaggio da vaeVictis »

Sto facendo confusione.
Aspetta un attimo che devo prendere un po' di tempo per fare alcune prove (escape vari e cassi e massi)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

cloudany [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603109#p4603109][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
vaeVictis [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603104#p4603104][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Anzi no, il tempo ce l'ho :)

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg SESTOCAMPO"  | sed -r 's/^(([^\s]* ){5})([^\s]*)/\1 -BUMBUM-STALLMAN- /'
1234 1234 1234 1234 lkhjg  -BUMBUM-STALLMAN- 
Andrebbe bene ma mi restituisce sul terminale se apro il file sempre -9 mi ritrovo :(
Fai una prova su una copia del file ma usa sed con l'opzione "-i"
Salva l'Ucraina! 🇺🇦
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

UbuNuovo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603116#p4603116][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
cloudany [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603109#p4603109][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
vaeVictis [url=http://forum.ubuntu-it.org/viewtopic.php?p=4603104#p4603104][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Anzi no, il tempo ce l'ho :)

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg SESTOCAMPO"  | sed -r 's/^(([^\s]* ){5})([^\s]*)/\1 -BUMBUM-STALLMAN- /'
1234 1234 1234 1234 lkhjg  -BUMBUM-STALLMAN- 
Andrebbe bene ma mi restituisce sul terminale se apro il file sempre -9 mi ritrovo :(
Fai una prova su una copia del file ma usa sed con l'opzione "-i"
Nulla :(

Codice: Seleziona tutto

sed: -e expression #1, char 34: invalid reference \1 on `s' command's RHS
" 4 letters are enough to explain mankind"
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

hai fatto così?

Codice: Seleziona tutto

sed -ir 's/^(([^\s]* ){5})([^\s]*)/\1 -BUMBUM-STALLMAN- /' copia_nome_file
Salva l'Ucraina! 🇺🇦
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

si
" 4 letters are enough to explain mankind"
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Modifica valore colonna file in BASH

Messaggio da vaeVictis »

Forse ci sono :D

Allora, per sostituire il -9 con "-BUMBUM-STALLMAN-"

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg -9 lkjdglkjdfglkj"  | sed -r 's/^(([^ \t]* ){5})-9 (.*)$/\1-BUMBUM-STALLMAN- \2/'
1234 1234 1234 1234 lkhjg -BUMBUM-STALLMAN- lkhjg 
Ma noi siamo gajardi, quindi usiamo le variabili così il comando è più generico.

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ toremove=-9
vaevictis@vaevictis-HAL:~$ toinsert=-BUMBUM-STALLMAN
vaevictis@vaevictis-HAL:~$ echo "1234 1234 1234 1234 lkhjg -9 lkjdglkjdfglkj"  | sed -r 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/'
1234 1234 1234 1234 lkhjg -BUMBUM-STALLMAN lkhjg 
Per modificare il file (non farlo subito inplace, prima fai le prove):
1) setta gli opportuni valori per le due variabili (come qui sopra) e poi dai

Codice: Seleziona tutto

sed -r 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/'
Guardati l'output e se ti gusta, per modificare in place, scrivi -ir al posto di -r
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti