如何遍历文件一行中的每个单词并逐行输出?
问题与解决方法
问题说明
text.txt的内容如下:
absolute abstract academic accepted accident
需要将该行中的每个单词逐个打印,期望输出:
absolute abstract academic accepted accident
尝试过两种方式但都有问题:
- 用
cat+循环+cut,但因为cut的字段从1开始计数,循环从0开始导致遗漏单词,代码如下:
words="$(cat text.txt | wc -w)" for ((i=0; i<$words; i++)); do cut -d' ' -f$i text.txt done
- 尝试用
awk但语法错误,输出混乱:
awk '{print $'$i'}'
解决方法
方法1:修正原有循环逻辑
问题出在循环起始值,把循环从1开始,到单词总数结束即可:
words=$(wc -w < text.txt) for ((i=1; i<=words; i++)); do cut -d' ' -f$i text.txt done
这里把cat text.txt | wc -w优化为wc -w < text.txt,减少不必要的子进程调用。
方法2:用awk高效处理
awk默认以空白分割字段,NF代表当前行的字段总数,直接在awk内部遍历打印每个字段:
awk '{for(i=1;i<=NF;i++) print $i}' text.txt
一行命令就能完成,无需外部变量,处理效率更高。
方法3:更简洁的替代命令
如果只是要把空格分隔的单词换成每行一个,还有更简单的命令可选:
- 用
tr替换空格为换行(若有连续空格,加-s压缩避免空行):
tr -s ' ' '\n' < text.txt
- 用
xargs拆分后逐行输出:
xargs -n1 < text.txt
xargs会自动处理连续空白字符,直接输出每个单词单独一行。
内容的提问来源于stack exchange,提问作者chyxo
相关产品推荐
相关产品推荐

