如何修改Bash脚本以找出每个文本文件中最长的两个单词
找出每个文本文件中最长的两个单词
原Bash脚本功能为找出每个可读文本文件中最长的单个单词:
for i; do if [[ -r $i ]]; then max_word= max_len=0 for j in $(strings $i); do len=${#j} if [[ $len -gt $max_len ]]; then max_len=$len max_word=$j fi done echo "$i : '$max_word' ($max_len characters)" fi done
需求:修改脚本,使其能找出每个文本文件中各自最长的两个单词,而非所有文件中的全局最长两个。
修改后的脚本
for i; do if [[ -r $i ]]; then # 每个文件处理前重置变量,确保仅针对当前文件计算 max_word= max_len=0 max_word2= max_len2=0 for j in $(strings $i); do len=${#j} # 优先判断是否超过第一长单词 if [[ $len -gt $max_len ]]; then # 原第一长降级为第二长 max_word2=$max_word max_len2=$max_len # 更新第一长 max_len=$len max_word=$j elif [[ $len -gt $max_len2 && $j != $max_word ]]; then # 长度介于第二长和第一长之间时,更新第二长(排除重复单词) max_len2=$len max_word2=$j fi done # 拼接输出结果,兼容只有单个有效单词的情况 output="$i : " [[ -n $max_word ]] && output+="'$max_word' ($max_len characters)" [[ -n $max_word2 ]] && output+=", '$max_word2' ($max_len2 characters)" echo "$output" fi done
关键修改说明
- 独立文件计算:在每个可读文件的处理流程开头,重置四个核心变量(
max_word、max_len、max_word2、max_len2),保证每个文件的最长单词计算完全独立,不会跨文件累积结果。 - 双层级比较逻辑:
- 新单词长度超过第一长时,将原第一长的内容转移到第二长变量,再更新第一长。
- 新单词长度未超过第一长但超过第二长时,直接更新第二长;加入
$j != $max_word是为了避免重复记录同一单词,若不需要该限制可删除此条件。
- 鲁棒性处理:输出时判断变量是否为空,避免文件只有一个有效单词时出现空值输出。
内容的提问来源于stack exchange,提问作者big daddy burger
相关产品推荐
相关产品推荐

