/ / Come posso leggere le parole (anziché le righe) da un file? - bash

Come posso leggere le parole (anziché le righe) da un file? - bash

Ho letto questa domanda su come leggere n caratteri da un file di testo usando bash. Mi piacerebbe sapere come leggere una parola alla volta da un file che assomiglia a:

example text
example1 text1
example2 text2
example3 text3

Qualcuno può spiegarmelo o mostrarmi un esempio facile? Grazie!

risposte:

9 per risposta № 1

Il read comando di default legge intere righe. Quindi la soluzione è probabilmente quella di leggere l'intera riga e quindi dividerla su spazi bianchi con ad es. for:

while read line; do
for word in $line; do
echo "word = "$word""
done
done

15 per risposta № 2

Il modo per farlo con gli input standard è passare il -a bandiera da leggere:

read -a words
echo "${words[@]}"

Questo leggerà l'intera riga in una variabile di array indicizzata, in questo caso denominata parole. È quindi possibile eseguire qualsiasi operazione su array che ti piace parole con espansioni dei parametri shell.

Per le operazioni orientate ai file, le versioni correnti di Bash supportano anche il mapfile incassato. Per esempio:

mapfile < /etc/passwd
echo ${MAPFILE[0]}

In ogni caso, gli array sono la strada da percorrere. Vale la pena dedicare tempo a familiarizzare Sintassi dell'array Bash per sfruttare al massimo questa funzione.


6 per risposta № 3

Normalmente, dovresti leggere da un file usando a while read -r line ciclo continuo. Per fare questo e analizzare le parole sulle linee è necessario nidificare a for loop all'interno del while ciclo continuo.

Ecco una tecnica che funziona senza richiedere cicli annidati:

for word in $(<inputfile)
do
echo "$word"
done

3 per risposta № 4

Nel contesto indicato, dove è noto il numero di parole:

while read -r word1 word2 _; do
echo "Read a line with word1 of $word1 and word2 of $word2"
done

Se vuoi leggere ogni riga in un array, read -a metterà la prima parola nell'elemento 0 del tuo array, il secondo nell'elemento 1, ecc:

while read -r -a words; do
echo "First word is ${words[0]}; second word is ${words[1]}"
declare -p words # print the whole array
done

0 per risposta № 5

Ho trovato questa domanda e le risposte proposte, ma non vedo elencato questa semplice soluzione possibile:

for word in `cat inputfile`
do
echo $word
done

0 per risposta № 6

In bash, basta usare lo spazio come delimitatore (read -d " "). Questo metodo richiede un po 'di pre-elaborazione per tradurre le newline in spazi (usando tr) e per unire più spazi in uno solo (usando sed):

{
tr "n" " " | sed "s/  */ /g" | while read -d " " WORD
do
echo -n "<${WORD}> "
done
echo
} << EOF
Here you have some words, including * wildcards
that don"t get expanded,
multiple   spaces   between   words,
and lines with spaces at the begining.
EOF

Il vantaggio principale di questo metodo è che non devi preoccuparti della sintassi dell'array e lavorare come con for loop, ma senza espansione con caratteri jolly.