[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

Re: Modifica valore colonna file in BASH

Messaggio da cloudany »

Al posto di ECHO per leggere un file uso cat giusto?

Codice: Seleziona tutto

cat hapmap3_r2_b36_fwd.ASW.qc.poly.ped  | sed -ir 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/'
Errore:

Codice: Seleziona tutto

sed: -e expression #1, char 36: invalid reference \2 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 »

ok, ho capito come funziona, una domanda [^\s] e [^ \t] in cosa differiscono? Non prendono entrambi spazi e tab?
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 »

No si passa il file direttamente al comando sed, alla fine del comando.

(ora modifico il precedente messaggio, l'avevo dato per scontato :) )

@UbuNuovo
Mi sa che \s prende anche \n
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 »

Giusto! Prende anche "\n". Grazie Vae
Ultima modifica di UbuNuovo il venerdì 20 giugno 2014, 15:23, 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 »

Codice: Seleziona tutto

 sed -ir 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/' hapmap3_r2_b36_fwd.ASW.qc.poly.ped
sempre lo stesso errore precedentemente messo
" 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 »

@cloudany
Devi impostare le due variabili.
Mi pare di aver dato tutte le "istruzioni" e che il comando non abbia problemi.
Rileggi attentamente :)
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 »

E l'ho fatto infatti O.o dichiaro le due variabili toremove=-9 e toinsert=ASW e do il comando
" 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 »

Non "descrivere".
Copia incolla dal terminale esattamente i comandi che hai scritto.
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 »

Codice: Seleziona tutto

#! /bin/bash
toremove=-9
toinsert=ASW
sed -ir 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/'
" 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 »

metti gli apici nelle assegnazioni (poi manca il nome del file)
Ultima modifica di UbuNuovo il venerdì 20 giugno 2014, 15:37, modificato 1 volta in totale.
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 »

E il file come glielo passi?
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 »

Codice: Seleziona tutto

#! /bin/bash
toremove=-9
toinsert=ASW
sed -ir 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/' hapmap3_r2_b36_fwd.ASW.qc.poly.ped
Dovrebbe andar bene...ma non va :(

Codice: Seleziona tutto

sed: -e expression #1, char 36: invalid reference \2 on `s' command's RHS
" 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 »

Ad occhio e croce mi pare strano.
Posta l'output del comando

Codice: Seleziona tutto

sed --version
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 »

Codice: Seleziona tutto

sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
" 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 »

Codice: Seleziona tutto

#!/bin/bash

toremove='-9'
toinsert='ASW'
sed -r 's/^(([^ \t]* ){5})'"$toremove"' (.*)$/\1'"$toinsert"' \2/' hapmap3_r2_b36_fwd.ASW.qc.poly.ped
#!/bin/bash
Questo a me funge (#!/bin/bash)
Ho la stessa versione di sed

edit: non dipende da quello ho provato.
Probabilmente il file ha troppe colonne anche per sed :muro:
Salva l'Ucraina! 🇺🇦
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 »

Ho ripreso l'idea originale!
Se i campi hanno come separatore il tab potresti provare a fare così:

con un file di esempio così:

Codice: Seleziona tutto

8-) cat hapmap3_r2_b36_fwd.ASW.qc.poly.ped 
2427	NA19919	NA19908	NA19909	1	-9	c7_1	c8_1	c9_1	c10_1
2528	NA19920	NA19909	NA19910	1	-9	c7_2	c8_2	c9_2	c10_2
2529	NA19921	NA19910	NA19911	1	foo	c7_3	c8_3	c9_3	c10_3
2530	NA19922	NA19911	NA19912	1	foo	c7_4	c8_4	c9_4	c10_4
potresti prendere solo i pochi campi che ti interessano e fare le sostituzioni con awk o con sed, in modo da non avere il problema dei troppi campi non gestibili.
per esempio:

Codice: Seleziona tutto

8-) awk -F $'\t' 'BEGIN {OFS = FS} { if ($6 == "-9") $6="ASW"; print > "parte1.txt" }' <(cut -f1-6 hapmap3_r2_b36_fwd.ASW.qc.poly.ped)
crea il file "parte1.txt", effettuando le sostituzioni

Codice: Seleziona tutto

8-) cat parte1.txt 
2427	NA19919	NA19908	NA19909	1	ASW
2528	NA19920	NA19909	NA19910	1	ASW
2529	NA19921	NA19910	NA19911	1	foo
2530	NA19922	NA19911	NA19912	1	foo
ti prepari il file "parte2.txt"

Codice: Seleziona tutto

8-) cut -f7- hapmap3_r2_b36_fwd.ASW.qc.poly.ped > parte2.txt
il file parte2.txt che risulta così:

Codice: Seleziona tutto

8-) cat parte2.txt 
c7_1	c8_1	c9_1	c10_1
c7_2	c8_2	c9_2	c10_2
c7_3	c8_3	c9_3	c10_3
c7_4	c8_4	c9_4	c10_4
riunisci in un unico file

Codice: Seleziona tutto

8-) paste parte1.txt parte2.txt > risultato.txt
Il file risultante è quello finale

Codice: Seleziona tutto

8-) cat risultato.txt 
2427	NA19919	NA19908	NA19909	1	ASW	c7_1	c8_1	c9_1	c10_1
2528	NA19920	NA19909	NA19910	1	ASW	c7_2	c8_2	c9_2	c10_2
2529	NA19921	NA19910	NA19911	1	foo	c7_3	c8_3	c9_3	c10_3
2530	NA19922	NA19911	NA19912	1	foo	c7_4	c8_4	c9_4	c10_4
Sperando che paste non abbia problemi con un numero elevato di campi.
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 »

Tu sei un mito!, ho infatti iniziato questa notte a lavorarci su su questa possibilità ma non riuscivo a fare la "seconda" parte, grazie mille davvero, e grazie anche a Vae (arrr!)
" 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: [RISOLTO]Modifica valore colonna file in BASH

Messaggio da vaeVictis »

"Dovresti" anche capire come mai ti dava errore l'altro comando.
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: [RISOLTO]Modifica valore colonna file in BASH

Messaggio da UbuNuovo »

Io credo che dipenda dal numero esagerato di campi.
Senza il file originale si fanno male le ipotesi.
Visto che il file originale contiene dati sensibili capisco che non possa essere pubblicato su un forum.
Comunque se trovi il baco faccelo sapere.
Ciaux
Salva l'Ucraina! 🇺🇦
Avatar utente
cloudany
Prode Principiante
Messaggi: 121
Iscrizione: domenica 28 febbraio 2010, 12:54
Desktop: Unity
Distribuzione: Ubuntu

Re: [RISOLTO]Modifica valore colonna file in BASH

Messaggio da cloudany »

Ho provato su un file con molte meno colonne, e non ha dato problemi, quindi presumo sia appunto il numero esagerato di colonne a dar problemi, anche Libreoffice storceva il naso davanti a quel file.
" 4 letters are enough to explain mankind"
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti