Salve, mi trovo davanti al seguente problema, ho un file che contiene centinaia di nomi messi in riga e devo fare uno script in Bash che riesca a prendere i nomi, riga per riga, per poi effettuarci delle modifiche nel caso tali nomi siano composti da più nomi, più precisamente se una persona ha più di un nome, il primo nome viene riportato per interno, mentre per gli altri nomi viene riportata solo l'iniziale. Ad esempio : luca giacomo franco diventerebbe lucagf Mi chiedevo come potrei fare? Grazie Inoltre ci sarebbe la possibilità di avere le iniziali maiuscole?

chiesto 31 Aug '15, 20:29

damiano%20puleo's gravatar image

damiano puleo
35227

modificato 31 Aug '15, 21:10


Propongo il seguente script

#!/bin/bash

while read -a nomi; do
  printf '%s' "${nomi[0]^}"
  for ((i = 1; i < "${#nomi[@]}"; i++)); do
    tmp="${nomi[i]:0:1}"
    printf '%s' "${tmp^}"
  done
  printf '\n'
done

Se il nome del file contenente lo script è per esempio myscript, allora è necessario renderlo eseguibile, con

chmod +x myscript

quindi usarlo fornendogli l'input e il nome del file di output, così

./myscript <input-file >output-file

Se il file input-file contiene per esempio le seguenti due linee:

luca giacomo franco
aldo francesco antonio

allora l'output sarà

LucaGF
AldoFA

Edit

Per leggere il valore da una variabile "$name" e metterlo in una variabile "$newname", ecco come si può fare:

read newname < <(while read -a nomi; do
  printf '%s' "${nomi[0]^}"
  for ((i = 1; i < "${#nomi[@]}"; i++)); do
    tmp="${nomi[i]:0:1}"
    printf '%s' "${tmp^}"
  done
  printf '\n'
done <<<"$name")

Edit2

Un'altra versione un po' più semplice:

while read -a nomi; do
  newname="${nomi[0]^}"
  for ((i = 1; i < "${#nomi[@]}"; i++)); do
    tmp="${nomi[i]:0:1}"
    newname="$newname${tmp^}"
  done
done <<<"$name"
coll. permanente

ha risposto 01 Sep '15, 10:56

enzotib's gravatar image

enzotib ♦♦
14.1k113187

modificato 02 Sep '15, 08:06

Lo script funziona grazie, mi chiedevo però come potrei inserire quello script nel mio script per adattarlo meglio a come dovrebbe essere, io ho un file che oltre a contendere i nomi ha anche altri dati sulla stessa riga, io leggo quindi la frase a pezzi, modifico quella che voglio (in questo caso il nome e basta) e poi reinserisco la frase in un file temporaneo che poi andrò a sostituire a quello di partenza. Io ho questo codice :

http://pastebin.ubuntu.com/12246093/

Come potrei fare per far funzionare il tuo script nel mio, se ho ben capito dovrei portare la mia variabile name dentro il vettore nomi e poi riportarla a name nel momento in cui devo inserirla nel file. Come potrei fare ? Grazie

(01 Sep '15, 15:55) damiano puleo damiano%20puleo's gravatar image

@damiano-puleo: non usare le risposte, usa i commenti, e per lunghi output usa pastebin.
Inoltre, il tuo problema è mal posto, dato che il tuo script è organizzato per leggere delle righe che contengono un numero prefissato di campi, mentre con questa domanda stai supponendo che l'utente possa avere un numero imprecisato di nomi.

(01 Sep '15, 17:58) enzotib ♦♦ enzotib's gravatar image

Scusa sono nuovo del forum, per quanto riguarda lo script se noti le prime righe di codice appena entrati nel while, io suddivido ogni campo prendendolo da una virgola fino a quella successiva, poi ogni campo può avere una qualsiasi lunghezza o numero di parole, il mio problema in questo caso era solo gestire il campo nome

(01 Sep '15, 18:54) damiano puleo damiano%20puleo's gravatar image

@damiano-puleo: scusa, non avevo visto la virgola. Leggi l'aggiunta che ho fatto alla risposta.

(01 Sep '15, 21:39) enzotib ♦♦ enzotib's gravatar image

Grazie mille ora funziona tutto come voglio

(01 Sep '15, 22:56) damiano puleo damiano%20puleo's gravatar image

@damiano-puleo: piuttosto che darmi punti, che vengono sottratti ai tuoi, e che ti ho restituito, accetta la mia risposta, e magari dalle anche un voto positivo. Così mi darai dei punti che non vengono sottratti dai tuoi.

(02 Sep '15, 08:00) enzotib ♦♦ enzotib's gravatar image

@damiano-puleo: inoltre ho aggiunto una versione un po' più semplice.

(02 Sep '15, 08:06) enzotib ♦♦ enzotib's gravatar image

Scusami ma non sono pratico del forum, come faccio ad accettare la risposta e a darle un voto positivo?

(02 Sep '15, 12:45) damiano puleo damiano%20puleo's gravatar image

@damiano-puleo: il voto positivo me lo hai già dato, quindi hai capito da solo come si fa, si clicca sul pollice sopra al voto della risposta. Se invece clicchi sul segno di spunta, questo diventa verde e la domanda risulta accettata.

(02 Sep '15, 12:56) enzotib ♦♦ enzotib's gravatar image

Fatto, Grazie

(02 Sep '15, 13:12) damiano puleo damiano%20puleo's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×106
×83
×52

domanda posta: 31 Aug '15, 20:29

domanda visualizzata: 2,326 volte

ultimo aggiornamento: 02 Sep '15, 13:12

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.