随笔 - 832  文章 - 2  评论 - 31  阅读 - 167万

linux按行读取 (while read line与for-loop)

转自: linux按行读取 (while read line与for-loop)

在linux下一般用while read line与for循环按行读取文件。现有如下test.txt文件:

 

 

 1. while read line

while read line; do
  echo $line
done < test.txt

输出结果与上图一致。

这里也可以写为:

cat test.txt | while read line; do
  echo $line
done

输出结果一致,但是需要注意一点,就是在如下情况下结果是不同的:

复制代码
# 第一种情况
while read line; do 
  name1=$line;
done < test.txt

echo $name1

# 第二种情况:
cat test.txt | while read line; do
  name2=$line
done

echo $name2
复制代码

在第一种情况下输出:
ENSMUSG00000000078.7 32.83699 29.78868 38.58607 30.348110000000002

第二种情况则无输出。

出现这种不同,是因为管道的机制,这个使用管道之后while read line是在子shell中进行的,所以退出之后$name2就没有值了。并且,cat 会一次性地把test.txt的所有内容都输入到内存,假如文件很大,则会占用很大的内存。但是第一种重定向的方法,是一行一行的读入,更省内存。

2. for循环
for i in `cat test.txt`;do
  echo $i
done

但是输出了这样的结果(部分结果):

 

 这是因为,在for循环中,每次是以空格/制表符为分割符输出。可以写成以下形式输出:

# 可以先将空格转为别的字符
for i in `sed 's/\t/#/g' test.txt`;do
  echo $i | sed 's/#/\t/g'
done

先将空格或者制表符替换为其他字符,输出的时候再替换回来即可




posted on   小破孩楼主  阅读(2627)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示