繁体   English   中英

使用awk命令使用CRLF删除重复文件

[英]removing duplicates files with CRLF using awk command

伙计们,我一直在使用awk命令来删除使用awk的重复项。问题是我面临的是因为每行末尾的CRLF。 在awk中有没有办法可以从比较中丢弃CRLF?

我使用的命令: awk '!seen[$0]++'

记录

HelloworldCRLF
how are youCRLF
Helloworld

第一个和第三个记录是相同的,我希望它被删除。 我猜因为最后一行没有CRLF,所以它会保留在输出中。 我尝试在记录的末尾添加CRLF以确保awk命令将其删除,但确实如此,但有时最后一条记录确实有一个CRLF,我最终得到一个额外的空行(因为我添加了CRLF)。 有办法解决这种情况吗?

顺便说一句,该文件是在Windows中生成的。

在进行比较之前替换\\r任何实例。

awk '{gsub(/\r/,"")}; !seen[$0]++'

您可以将CRLF序列添加到记录分隔符:

awk -v RS='\n|\r\n' '!seen[$0]++' file

你的问题不是Windows在每个LF之前添加了CR(正如其他人到目前为止所认为的那样),这就是你的文件在文件末尾缺少换行符(对于Windows是CRLF组合)。 对没有终止换行符的文件运行UNIX命令时,所有的赌注都会关闭,因为此时它不再是真正的“文本文件”。 你可以修改生成文件的任何工具来生成终止换行符吗? 如果不是那么做

printf '\r\n' >> file

在运行awk或其他任何工具之前。 那么你可以运行dos2unix或任何其他建议来处理/删除\\r s,如果有必要。 例如:

$ 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上使用-v BINDMODE=3和gawk来阻止低级原语在gawk脚本看到之前剥离\\r s。

在评论中的问题,这就是为什么你不能只在你的dodorstep上显示的每个文件上运行dos2unix。 想象一下这个使用回车符(control-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行的字段3为空,而第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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM