排序| uniq 无法处理不同的文件

排序| uniq 无法处理不同的文件

我不知道为什么这个命令

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“列出当前行”来发现差异视觉上明确形式”。

相关内容