[英]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.