Eine andere Lösung:
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}
Normalerweise würden Sie einen while read
verwenden wollen Schleife statt for i in $(cat)
, aber da Sie möchten, dass alle Wörter geteilt werden, würde es in diesem Fall gut funktionieren.
#!/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-Einzeiler.
sed 's/ /\n/g' YOUR_FILENAME | sort | uniq | awk '{print length, $0}' | sort -nr | head -n 1
- Datei lesen und Wörter teilen (über sed)
- Duplikate entfernen (via sort | uniq)
- stell jedem Wort seine Länge voran (awk)
- sortiere die Liste nach der Wortlänge
- drucke das einzelne Wort mit der größten Länge.
Ja, das wird langsamer sein als einige der oben genannten Lösungen, aber es erfordert auch nicht, sich an die Semantik von Bash für Schleifen zu erinnern.
longest=""
for word in $(cat so.txt); do
if [ ${#word} -gt ${#longest} ]; then
longest=$word
fi
done
echo $longest