我的问题摘要如下:
我有两个文本文件(downloaded.txt和list.txt)
list.txt包含一个URL列表,例如:
http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe
downloaded.txt包含已下载的文件列表:
file1.exe
file2.exe
file3.exe
file5.exe
我想要做的是比较这两个文件,以便我可以看到哪些文件没有被下载(在这个例子中它将是file4.exe
我将如何实现这一目标?
我尝试过这样做,让我们说结果是灾难性的(10米+'结果'由于某种原因,我必须继续按Enter才能让它运行。而且,只有144k行):
while read url; do
if ! grep "$url" downloaded.txt; then
echo $url;
fi;
done < list.txt >> files_to_download.txt
答案 0 :(得分:1)
使用awk
使用网址中的最后一个元素比较两个文件:
$ awk -F/ 'FNR==NR {downloaded[$0]=$0; next} !($NF in downloaded)' downl list
http://example.com/file4.exe
这将循环文件downloaded.txt
并将其值存储在数组downloaded[]
中。然后,它遍历文件list.txt
并检查数组中是否出现最后/
- 切片。如果没有,则打印该行。
答案 1 :(得分:1)
使用grep
,您可以从文件名(-f
选项)中读取模式。在您的情况下,您可以撤消匹配(-v
),假设downloaded.txt
中的文件名未出现在路径中的任何位置:
grep -vFf downloaded.txt list.txt
-F
修复字符串匹配。
这会将http://example.com/file4.exe
作为输出。获取文件名:
grep -vFf downloaded.txt list.txt | awk -F/ '{ print $NF }'
输出file4.exe
。
示例:强>
% cat list.txt
http://example.com/file1.exe
http://example.com/file2.exe
http://example.com/file3.exe
http://example.com/file4.exe
http://example.com/file5.exe
% cat dl.txt
file1.exe
file2.exe
file3.exe
file5.exe
% grep -vFf dl.txt list.txt
http://example.com/file4.exe
% grep -vFf dl.txt list.txt | awk -F/ '{ print $NF }'
file4.exe