你的问题不在于视窗每LF前加入(CRS其他人一样,到目前为止似乎认为),它是你的文件在最后缺少一个换行符(其中Windows是CRLF组合)的文件。当针对没有终止换行符的文件运行UNIX命令时,所有投注都将关闭,因为在那时该文件不再是真正的“文本文件”。你能修改生成文件的任何工具来产生一个终止的换行符吗?如果没有,那么在运行awk或其他任何工具之前,请执行
printf '\r\n' >> file
。那么你可以运行dos2unix
或任何其他建议来处理/删除\r
如有必要。例如:
$ cat -v file
Helloworld^M
how are you^M
Helloworld$
通知的$
,并立即开始我的提示最后Helloworld
后,由于文件中缺少换行符。现在:
$ awk -v BINMODE=3 '!seen[$0]++' file | cat -v
Helloworld^M
how are you^M
Helloworld
$
$ printf '\r\n' >> file
$
$ awk -v BINMODE=3 '!seen[$0]++' file | cat -v
Helloworld^M
how are you^M
$
$ dos2unix file
dos2unix: converting file file to Unix format...
$
$ awk '!seen[$0]++' file | cat -v
Helloworld
how are you
$
我必须在上述Cygwin来从剥离\r
S中的GAWK脚本看到之前停止下级元,使用-v BINDMODE=3
与GAWK。
关于评论中的问题,以下是为什么您不能在每个出现在您的dodorstep上的文件上运行dos2unix。想象此文件使用回车(控制-MS)作为字段分隔符:
$ printf 'a\rb\r\nd\r\rf\n' > file
$ cat -v file
a^Mb^M
d^M^Mf
$ awk -v BINMODE=3 -F'\r' '{for (i=1;i<=NF;i++) print NF, i, "<"$i">"; print "----"}' file
3 1 <a>
3 2 <b>
3 3 <>
----
3 1 <d>
3 2 <>
3 3 <f>
----
正如你可以看到AWK正确地认识到,每行有3个字段和字段3是空的第1行,而字段2是在第2行空了。现在,让我们在它上面运行DOS2UNIX的,然后再试一次:
$ dos2unix file
dos2unix: converting file file to Unix format...
$ cat -v file
a^Mb
d^M^Mf
$ awk -v BINMODE=3 -F'\r' '{for (i=1;i<=NF;i++) print NF, i, "<"$i">"; print "----"}' file
2 1 <a>
2 2 <b>
----
3 1 <d>
3 2 <>
3 3 <f>
----
正如你可以看到dos2unix
由1号线剥离空场3损坏的文件,因为当它看到\r\n
它假定这是一个DOS行结束,而不是FS之后是RS。
@WalterA会从整个文件中删除'\ r's,而不是每行的结尾,在任何情况下额外的'\ r's都不是OP问题,他的问题是缺少的新行(CRLF在他的情况下)在文件的末尾。 –