比较两个URL列表并将新添加的URL打印到新文件中


8

最初,我将生成两个包含URL列表的文件-我将它们称为oldnew。我想比较两个文件,如果文件中有任何URL,但这些URL new不在old文件中,我希望将这些URL 显示在extra_urls文件中。

现在,我已经阅读了一些有关使用diff命令的内容,但是据我所知,这也分析了信息的顺序。我不希望订单对输出有任何影响。我只是希望将多余的URL new打印到extra_urls文件中,无论它们在其他两个文件中的放置顺序如何。

我怎样才能做到这一点?

Answers:


14

您可以使用该comm命令比较两个文件,并有选择地显示一个或另一个唯一的行或共同的行。它要求对输入进行排序,但是您可以使用流程替换对输入进行即时排序。

comm -13 <(sort old.txt) <(sort new.txt)

如果您使用的版本bash不支持进程替换,则可以使用命名管道对其进行仿真。Wikipedia中显示了一个示例。


简洁但有效-正是所需的内容,是我所需要的出色代码。
neilH 2015年

嗯,但是如果对输入进行排序,那么diff会做同样的事情,对吗?
justhalf

diff将显示所有差异。comm允许您选择是要查看文件1,文件2的行还是它们共同的行。
Barmar

嗨,Barmar,不确定您是否会对此进行检查,以防万一,我已将此脚本移至Synology Nas上以从那里运行。自从Synology运行脚本以来,我现在遇到语法错误:第60行:语法错误:意外的“(”
neilH 2015年

bash它运行什么版本?它可能不支持流程替换。
Barmar

6

我只会用grep

grep -vFf old new > extra_urls

说明

  • -f:告诉grep您从文件中读取其搜索模式。在这种情况下,old
  • -v :告诉grep反转匹配项,只打印不匹配的行。
  • -F:告诉grep将其搜索模式解释为字符串,而不是正则表达式。这样,.URL的将按字面值进行匹配。

结合起来,这些命令可以grep打印new不在中的任何行old。文件中URL的顺序无关紧要。


嗨,大家好,谢谢您的输入。我刚刚对此进行了测试,尽管“新”文件中有新的url,但它还是产生了一个空白的“额外的URL” _file。
neilH 2015年

@ bms9nmh嗯,很奇怪。请编辑您的问题,以举例说明您的输入文件。您可能还想进入站点的聊天室,我们可以在此进行进一步讨论。
terdon

2
您需要添加-F纯文本格式
glenn jackman 2015年

1

由于订单对您很重要,因此请使用 awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra

1
嗨,格伦,为了澄清,顺序并不重要。url的顺序不是问题,只是两个文件之间的区别,即附加的url。我不希望这种差异以任何方式影响输出。
neilH 2015年

@ bms9nmh:您可以更改> extra| sort > extra。或者| sort -u > extra如果您只希望一个新的url在输出中出现一次,而不管它在输入中出现了多少次。输入顺序可能会影响输出顺序,除非您在执行该操作的某处做了额外的工作以防止它发生。
史蒂夫·杰索普

@steve,meh,comm虽然grep -Fvf也是很好的方法,但这是最好的答案
glenn jackman 2015年

0

我有一个名为meld的应用程序。它允许并排查看两个(或三个)文件,显示差异,并允许选择性地从一个复制到另一个或删除字符。

可以从终端安装融合

sudo apt-get install meld 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.