【问题标题】:Why does unix while read not read last line? [duplicate]为什么 unix while read 不读最后一行? [复制]
【发布时间】:2013-11-15 21:16:21
【问题描述】:

我的脚本

export IFS=":"

cat hello | while read a b c d; do
    echo $a,$b,$c,$d
done

我的档案hello

1:1:1:1
2:2:2:2
3:3:3:3

我的输出

1,1,1,1
2,2,2,2

如果我在hello 中的3:3:3:3 之后放置一个空行,那么输出将变为

1,1,1,1
2,2,2,2
3,3,3,3

任何人都知道我可以如何解决这个问题,所以我不需要在hello 的末尾添加一个空行吗?

【问题讨论】:

    标签: linux bash shell unix


    【解决方案1】:

    发生的情况是,read 命令在输入未以换行符终止时失败。由于文件末尾缺少换行符,read 失败,因此跳过了while 循环的最后一次迭代。

    如果您不想/不能确保您的输入文件末尾有换行符,您可以将catecho 组合在一起,以提供外观输入由换行符终止,例如:

    { cat hello; echo; } | while read a b c d; do
        echo $a,$b,$c,$d
    done
    

    或者像这样:

    (cat hello; echo) | while read a b c d; do
        echo $a,$b,$c,$d
    done
    

    【讨论】:

      【解决方案2】:

      This is an extensive reading for the question why?

      如果你不想在最后换行,你可以这样做:

      while IFS=: read -r a b c d || [ -n "$a" ]; 
      do     
      echo $a,$b,$c,$d; 
      done < file
      

      或者使用grep:

      while IFS=: read -r a b c d; 
      do     
      echo $a,$b,$c,$d; 
      done < <(grep "" filee)
      

      注意:

      1. 没有必要将 cat 与 while 循环一起使用。
      2. You should almost always use the -r option with read.

      【讨论】:

      • 这对我来说效果最好,谢谢。 @janos 的答案也有效,但使用了一个子shell——在他们的答案中设置在 while 循环内的任何东西都只存在于那个范围内(例如,如果你要从文件中导出变量以在 while 循环之外使用——你想使用这个答案)
      【解决方案3】:

      当且仅当它丢失时,存在一个不太知名的讨厌的 hack 将丢失的最终换行符附加到文本流:

      sed '$a\'
      

      例如,请参阅 unix.stackexchange 上的 this discussion

      【讨论】:

      • 有很多这样的。其他包括grep ^awk 1paste
      【解决方案4】:

      这很可能是由于您的输入文件的最后一行之后没有换行符。

      运行此命令找出:

      cat -vte hello
      

      看看你会得到什么。

      【讨论】:

        【解决方案5】:

        您的文件可能在最后一行缺少换行符 (\n)。 您可以通过打印$a 等的残值来证明这一点,就像这样

        while IFS=: read a b c d; 
        do     
        echo $a,$b,$c,$d; 
        done < hello  
        echo $a,$b,$c,$d
        

        修复文件。 此外,您应该能够专门为read 设置IFS,如上所示。也不需要cat文件,只需使用输入重定向,如图所示

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-08
          • 2018-12-02
          • 1970-01-01
          • 2021-10-27
          • 2012-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多