文本文件中的最后一个空行不会删除

Last blank line in text file won't delete

我有一个 text/TSV 文件,其结尾看起来像这样:

chrY    57000000    57099999    0
chrY    57100000    57199999    0
chrY    57200000    57227415    0
[blank line]

空白行在记事本 (Ln 30895, Col 1) 中被识别为一行,当我按退格键时,它会转到倒数第二行(我希望文件结束的地方)。然而,它并没有被任何常见的删除最后一行的命令选中,这些命令只删除倒数第二行,产生如下输出:

chrY    57000000    57099999    0
chrY    57100000    57199999    0
[blank line]

而不是:

chrY    57000000    57099999    0
chrY    57100000    57199999    0
chrY    57200000    57227415    0

到目前为止我尝试过的:

还值得注意的是最后一行没有空白字符(例如空格或制表符)

一如既往,非常感谢您的帮助!

更新

a Hexdump 产生以下输出:

000d0690: 0935 3730 3939 3939 3909 300a 6368 7259  .57099999.0.chrY
000d06a0: 0935 3731 3030 3030 3009 3537 3139 3939  .57100000.571999
000d06b0: 3939 0930 0a63 6872 5909 3537 3230 3030  99.0.chrY.572000
000d06c0: 3030 0935 3732 3237 3431 3509 300a       00.57227415.0.

根据我的理解,我需要从这些文件中删除换行符以便通过另一个工具 运行 它们,有什么方法可以在创建文本文件后删除换行符.

在 POSIX 平台上,文本文件需要在每一行的末尾都有一个换行符,包括最后一行。

如果您需要 trim 在将文件作为输入传递给需要破坏最后一个的工具时最后一个换行符,我只会在您传递给该工具的流中删除它,而不是而不是破坏物理文件的完整性。

brokentool -input <(awk 'FNR>1 { printf "\n" } { printf "%s", [=10=] }' in.txt)

语法 <( command ) 称为 进程替换。 它看起来像一个文件名(类似于 /dev/fd/63),但它是一个当您从 command 中读取时,它会产生输出的临时文件系统条目。

此语法特定于 Bash shell。

Awk 脚本的逻辑应该相当简单;如果我们当前没有处理第一行,我们打印一个换行符(以便在我们处理的前一行添加一个换行符,当有前一行时)然后打印当前行而不换行。最终效果是我们从下一行“借”换行符并将其放回去,除非该行是文件中的最后一行,因此没有什么可以借用的。