我不知道为什么这个命令
sort filename.txt | uniq
无法处理此文件:http://packetstormsecurity.com/files/32089/koran.gz.html
我也用过:
awk '!seen[$0]++' koran.txt
perl -ne 'print unless $dup{$_}++;' koran.txt
并且似乎没有人在处理这个特定文件。知道为什么吗?
答案1
don_crissti
他的评论中已经强调了主要问题。他通过运行以下命令确定文件类型:
file koran
...输出:
ASCII C++ program text, with CRLF, LF line terminators
您需要删除结尾处存在的CR
(回车 - 十六进制值)字符\x0D
一些输入文件中的行。这CR
是 Microsoft Windows 样式行尾 (CRLF) 的第一个字符。第二个 (MS) 字符是LF
(换行)。 SingleLF
是 Unix 样式行终止符的单个有效字符。以下是CR
从文件中 删除不需要的字符的一种方法:
sed 's/\x0D$//' koran | sort -u
sort
有一个选项-u
“仅输出相等运行的第一个”,因此您实际上不需要将其通过管道传输到uniq
或者,如果您确定这CR
是唯一的非印刷文件中的字符,您可以简单地使用字符排序-i
选项ignore nonprinting
; - 例如。CR
sort -iu koran
更新:
根据@Francesco Mantovani
的评论,一些输入行 - 在其他先前未提及的文件中 - 也在 CR 之前带有尾随空格。这可以通过以下方法轻松处理sed
:
sed 's/[[:space:]]\+$//' male.txt female.txt | sort -u
sed -n l
顺便说一句,我通过将输出管道到- 按照man sed
命令l
“列出当前行”来发现差异视觉上明确形式”。