为什么 sort -u 或 uniq 不删除串联文本文件中的重复项?
Why isn't sort -u or uniq removing duplicates in concatenated text files?
我正在尝试编写一个 bash 脚本,从我的 boxen 的不同位置获取三个用户词典,并将它们合并,删除重复项,然后将它们写回各自的区域。
但是,当我 cat
文件并执行 sort -u
或 uniq
时,重复的行仍然存在:
Alastair
Alastair
Albanese
Albanese
Alberts
Alberts
Alec
Alec
Alex
Alex
我将范围缩小到其中一个文件,它来自 Microsoft Outlook/Windows,名为 CUSTOM.DIC。通过使用 file -i
检查它,我发现它是一个 UTF-16le 文件(并且在与 UTF-8 文件直接连接时打印东方字符),所以我 运行 命令
iconv -f utf-16le -t utf-8 CUSTOM.DIC -o CUSTOMUTF8.DIC
然而,当我将该文件与我的其他 UTF-8 文件连接时,它会生成无法使用 sort -u
或 uniq
.
删除的重复项
我发现对于大文件,file -i
仅从前(许多)千行猜测文件格式,所以我 运行 命令
file_to_check="CUSTOMUTF8.DIC"
bytes_to_scan=$(wc -c < $file_to_check)
file -b --mime-encoding -P bytes=$bytes_to_scan $file_to_check
输出:
所以转换已经发生,输出文件 combined.txt
也是 UTF-8,为什么我不能删除重复的行?
我也检查了合并文件中是否有尾随空格。
这感觉像是很多人以前见过的问题,但我找不到答案(当然,或者我创建了错误的搜索字符串)...
非常感谢@Andrew Henle - 我知道这会很简单!
确实,使用 hexdump -c combined2.txt
我看到有些行以 \n
结尾,有些行以 \r\n
.
结尾
所以我下载了dos2unix
和运行
dos2unix combined2.txt
sort -u combine2.txt > combined3.txt
一切都很好!
再次感谢安德鲁!
我正在尝试编写一个 bash 脚本,从我的 boxen 的不同位置获取三个用户词典,并将它们合并,删除重复项,然后将它们写回各自的区域。
但是,当我 cat
文件并执行 sort -u
或 uniq
时,重复的行仍然存在:
Alastair
Alastair
Albanese
Albanese
Alberts
Alberts
Alec
Alec
Alex
Alex
我将范围缩小到其中一个文件,它来自 Microsoft Outlook/Windows,名为 CUSTOM.DIC。通过使用 file -i
检查它,我发现它是一个 UTF-16le 文件(并且在与 UTF-8 文件直接连接时打印东方字符),所以我 运行 命令
iconv -f utf-16le -t utf-8 CUSTOM.DIC -o CUSTOMUTF8.DIC
然而,当我将该文件与我的其他 UTF-8 文件连接时,它会生成无法使用 sort -u
或 uniq
.
我发现对于大文件,file -i
仅从前(许多)千行猜测文件格式,所以我 运行 命令
file_to_check="CUSTOMUTF8.DIC"
bytes_to_scan=$(wc -c < $file_to_check)
file -b --mime-encoding -P bytes=$bytes_to_scan $file_to_check
输出:
所以转换已经发生,输出文件 combined.txt
也是 UTF-8,为什么我不能删除重复的行?
我也检查了合并文件中是否有尾随空格。
这感觉像是很多人以前见过的问题,但我找不到答案(当然,或者我创建了错误的搜索字符串)...
非常感谢@Andrew Henle - 我知道这会很简单!
确实,使用 hexdump -c combined2.txt
我看到有些行以 \n
结尾,有些行以 \r\n
.
所以我下载了dos2unix
和运行
dos2unix combined2.txt
sort -u combine2.txt > combined3.txt
一切都很好!
再次感谢安德鲁!