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

标签 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;

但是如果我保存文件,在输入最后一个数字后没有按回车键,即在这个 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}"

请帮忙

最佳答案

使用

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

关于linux - 脚本不读取文件的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17194776/

相关文章:

Android USB 配件与 Linux 系统通信

linux - 如何区分 $1 作为 shell 变量和 $1 作为 awk 变量?

macos - 在与 shell 脚本相同的目录中创建文件夹

shell - ssh在远程计算机上运行shell脚本,然后将输出复制到本地计算机

c - 如何使用 C 中管道的信息输出到文件?

linux - 如何在 Linux 上的 Win7 VM 中使用多播?

linux - 你可以在 Linux Docker 容器中运行 GUI 应用程序吗?

linux - 如何在 shell 脚本中运行此命令

linux - Unix 命令将用户添加到允许 SSH 访问的允许用户列表?

c - 使用无效输入时的段错误