为什么unix读取时不读最后一行?

我的脚本

export IFS=":" cat hello | while read abcd; 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 

如果我在3:3:3:3之后input一个空行,那么输出就变成了

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

任何人都知道我可以如何解决这个问题,所以我不需要在你最后一个空行?

Solutions Collecting From Web of "为什么unix读取时不读最后一行?"

发生什么事情是,当输入没有以换行符结束时, read命令失败。 由于换行符在文件末尾丢失, read失败,因此跳过while循环的最后一次迭代。

如果你不想/不能确保你的输入文件最后有一个换行符,你可以用一个echo对你的cat进行分组,以给出一个由换行符终止的输入的外观,例如这样:

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

或者像这样:

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

有一个不是很知名的,令人讨厌的黑客手段,以补充一个缺少的最后一个换行符文本流当且仅当它缺少:

 sed '$a\' 

例如,参见关于unix.stackexchange的讨论 。

这是一个广泛的阅读为什么?

如果你不想在最后加上新的一行,你可以这样做:

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

或者使用grep

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

注意:

  1. 没有必要在while循环中使用cat。
  2. 你应该几乎总是使用阅读-r选项。

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

运行这个命令找出:

 cat -vte hello 

看看你得到了什么。

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

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

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