美文网首页小教程收藏
linux按行读取 (while read line与for-l

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

作者: 生信编程日常 | 来源:发表于2020-09-11 21:58 被阅读0次

    在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
    

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

    欢迎关注!

    相关文章

      网友评论

        本文标题:linux按行读取 (while read line与for-l

        本文链接:https://www.haomeiwen.com/subject/aoxiektx.html