脚本不读取文件的最后一行

时间:2013-06-19 15:06:04

标签: linux shell unix

我在Windows中使用记事本创建了一个文件:

    26453215432460
    23543265235421

    38654365876325


    12354152435243

我有一个脚本会读取每一行,并在每行的其他文件中创建如下所示的命令,不会考虑空白行:

    CRE:EQU,264532154324600,432460,1;

现在,如果我在输入数字12354152435243的最后一行后输入后保存输入文件,则输出文件包含上面对应所有数字的命令(包括最后一个12354152435243

    CRE:EQU,264532154324600,432460,1;
    CRE:EQU,235432652354210,235421,1;
    CRE:EQU,386543658763250,876325,1;
    CRE:EQU,123541524352430,435243,1;

但如果我保存文件,在最后一个数字输入后没有按Enter键,即在12354152435243之后,那么在脚本执行之后,我看不到输出文件是否有命令最后一个号码:

    CRE:EQU,264532154324600,432460,1;
    CRE:EQU,235432652354210,235421,1;
    CRE:EQU,386543658763250,876325,1;

有人可以解释代码中的错误:

    while read LINE
    do
    [ -z "$LINE" ] && continue
    IMEI=`echo $LINE | sed 's/ //g' | sed -e 's/[^ -~]//g'`
    END_SERIAL=`echo $IMEI | cut -c9- | sed 's/ //g' | sed -e 's/[^ -~]//g'`
    echo "CRE:EQU,${IMEI}0,${END_SERIAL},${list},,${TODAY};" >> /apps/ins/list.out
    done < "${FILE_NAME}"

请帮助

4 个答案:

答案 0 :(得分:4)

使用

grep . "${FILE_NAME}" | while read LINE

while read LINE
do
....
done < <(grep . "${FILE_NAME}")

grep对于行结束不太明智,你将获得一个免费的空行跳过...:)

老实说,从未尝试过Windows,以上所有内容都适用于unix ...

编辑说明:

制作下一个文件:

echo -n -e 'line\n\nanother\nno line ending here>' >file.txt

该文件包含4行(尽管最后一行“行”不是“正确”行)

line

another
no line ending here>

通常的shell例程,readwc寻找行结尾。因此,

$ wc -l file.txt 
         3 file.txt

当你翻看''(空字符串)时,grep返回找到字符串的每一行,所以

$ grep '' file.txt

打印

line

another
no line ending here>

当grep打印出找到的行时 - 确保最后存在一个“\ n”,所以

$ grep '' file.txt | wc -l

返回

4

因此,对于这些情况,最好将grep-c(计数)一起使用,而不是wc

$ grep -c '' file.txt
4

现在,.点。点表示任何字符。因此,当您点击.时,您将获得包含至少一个字符的所有行。 因此,它将跳过所有不包含任何字符的行=跳过空行。所以,

$ grep . file.txt
line
another
no line ending here>

再次,添加行结束到最后一行(并跳过空行)。请记住,(空格)也是字符,所以当该行只包含一个空格时,它不是空的。计算非空行

$ grep . file.txt | wc -l
      3

或更快

$ grep -c . file.txt
3

答案 1 :(得分:0)

如果您执行了help read,则说明-d delim continue until the first character of DELIM is read, rather than newline

因此,只有当您点击\n或指定-d delim时,才会继续阅读。

因此您可能需要更改分隔符,或者可以尝试read -e

答案 2 :(得分:0)

read用于读取输入的行尾。尝试

echo -n $'a\nb' | while read x ; do echo $x ; done

仅打印a

答案 3 :(得分:0)

读取将读取,直到找到新行,当找到新行时,它将返回该行。但是如果文件以新行结束,则read将此视为错误。因此,即使read已设置返回变量并且行读取到现在为止,返回代码read也会设置为指示错误。现在while read ...这个循环体只有在命令执行成功时才会执行,这不是这里的情况。因此,你错过了最后一行。

为了克服这个问题,您可以更改条件以检查返回变量是否为空。因此,即使读取失败,条件也会成功,因为变量已经设置到文件末尾。

这与在不同操作系统中结束的行无关,我的意思是它以某种方式相关,但确切的根本原因始终是read无法在行/文件的末尾找到新行,并且最后一行缺少循环体。

以下是一个例子

[[bash_prompt$]]$ echo -ne 'hello\nthere' > log
[[bash_prompt$]]$ while read line; do  echo $line; done < log
hello
[[bash_prompt$]]$ while read line || [ -n "$line" ]; do  echo $line; done < log
hello
there
[[bash_prompt$]]$