Bash 无法正确删除重复项

Bash 无法正确删除重复项,bash,ubuntu,awk,sed,hosts,Bash,Ubuntu,Awk,Sed,Hosts,我不熟悉shell脚本,我正试图编写一个小脚本来下载和解析主机文件 cd /tmp rm hosts* #Download files aria2c -j 10 http://winhelp2002.mvps.org/hosts.txt -o hostsA aria2c -j 10 "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext" -o

我不熟悉shell脚本,我正试图编写一个小脚本来下载和解析主机文件

cd /tmp

rm hosts*

#Download files
aria2c -j 10 http://winhelp2002.mvps.org/hosts.txt -o hostsA
aria2c -j 10 "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext" -o hostsB

#Parse files
sed 's/0.0.0.0/127.0.0.1/' hostsA>  hostsM
sed -n '/^127.0.0.1/p' hostsB  >> hostsM  

#Remove duplicates
awk '!x[$0]++' hostsM > hosts

#mv /etc/hosts /etc/hosts.backup
#mv hosts.txt /etc/hosts

echo "Complete."
例如,以下条目出现两次:

127.0.0.1 newopenx.detik.com
这是完整的主机很好


我做错了什么?

如果您不介意排序,则
排序的
-u
选项将删除重复项。记忆法:独特的

sort -u hostsM >hosts
上一行将复制以127.0.0.1开头的每一行。如果您只想保留这些内容并丢弃其他内容,请使用-n选项:

sed -n '/^127.0.0.1/p' hostsB >>hostsM

将您的awk更改为:

awk '{sub(/\r/, "")} !x[$0]++' hostsM > hosts

由于原始主机文件中的某些行在
\n
之前有尾随
\r
(例如
DOS EOL
)。

将awk更改为
awk'!x[$1]+'hostsM>hosts
这也不起作用。所有行都以
127.0.0.1
开头,所以这不重要,对吗?好的,然后将您的
hosts
文件放到问题中。添加了dropbox链接。我最初使用的是
-n
选项。我对sed不太熟悉,阅读它的手册页时,我没有意识到安静的输出意味着这一点。另外,我希望有一个非排序的解决方案。复杂性是
O(nlogn)
(实际上它将是knln(n)+n),而不是
O(n)
。由于
n
非常大(没有条目),排序不是最优的。谢谢!我完全忘记了Web服务器更喜欢
\r\n
而不是
\n
。呸。