Un'altra soluzione:
for item in $(cat "$infile"); do
length[${#item}]=$item # use word length as index
done
maxword=${length[@]: -1} # select last array element
printf "longest word '%s', length %d" ${maxword} ${#maxword}
Normalmente, dovresti usare un while read
loop invece di for i in $(cat)
, ma poiché vuoi che tutte le parole siano divise, in questo caso funzionerebbe bene.
#!/bin/bash
longest=0
for word in $(<so.txt)
do
len=${#word}
if (( len > longest ))
then
longest=$len
longword=$word
fi
done
printf 'The longest word is %s and its length is %d.\n' "$longword" "$longest"
bash one liner.
sed 's/ /\n/g' YOUR_FILENAME | sort | uniq | awk '{print length, $0}' | sort -nr | head -n 1
- leggere il file e dividere le parole (tramite sed)
- rimuovi i duplicati (tramite sort | uniq)
- prefisso ogni parola con la sua lunghezza (awk)
- ordina l'elenco in base alla lunghezza della parola
- stampa la singola parola con la lunghezza maggiore.
sì, questo sarà più lento di alcune delle soluzioni di cui sopra, ma non richiede nemmeno di ricordare la semantica di bash per i cicli.
longest=""
for word in $(cat so.txt); do
if [ ${#word} -gt ${#longest} ]; then
longest=$word
fi
done
echo $longest