为什么unix在读取时没有读到最后一行?

时间:2013-11-15 21:16:22

标签: linux bash shell unix

我的剧本

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

如果我在3:3:3:3 hello之后放一个空行,那么输出就会变为

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

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

5 个答案:

答案 0 :(得分:13)

输入未以换行符终止时,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

答案 1 :(得分:6)

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 with while循环。
  2. You should almost always use the -r option with read.

答案 2 :(得分:5)

当且仅当它丢失时,存在一个不太知名的讨厌的黑客来向文本流添加缺少的最终换行符:

sed '$a\'

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

答案 3 :(得分:1)

很可能是由于输入文件中最后一行之后缺少换行符。

运行此命令以查找:

cat -vte hello

看看你得到了什么。

答案 4 :(得分:1)

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

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

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