Shell 命令行求两个文件每行对比的相同内容
Shell 命令行求两个文件每行对比的相同内容遇到的一个实际问题是,2017年08月01日起,所有未经实名的域名,全部停止解析。而我手上有不少域名,其中很多都是没有实名的。但我不知道哪些实名了,哪些没有实名。所以,我搞到了两个文件:
现在,我需要得到的是,我的域名在所有未实名域名列表中出现的个数。 简单来说,就是求a文件和b文件的每行对比的合集。 两层 while 循环求合集事实上我解决这个问题是用js解决的。把两个文件构建成数组之后,通过两层循环对比,就输出了我想要的结果。 但这不是学习shell嘛,尝试用同样的思路,用shell解决。 代码如下: cat b.txt | while read lineb
do
cat a.txt | while read linea
do
if [ $lineb -eq $linea ]
then
echo $lineb
fi
done
done
逻辑非常简单。两层while循环,对比就可以完成了。 两层 for 循环求合集上面查了一下用 for i in $(cat b.txt); do
for j in $(cat a.txt); do
if [ $j -eq $i ]
then
echo $i
fi
done
done
逻辑是一模一样的。 一层 for 循环加 grep 求合集好了,上面都是逻辑非常简单的处理。那么有没有可能用一层的循环来解决问题呢? 答案是可以的。我们需要用到 那么逻辑就非常简单了。循环其中一个文件,把每一行的内容利用 代码如下: for i in $(cat b.txt); do
grep "&;$i&;" a.txt
done
循环b文件,并且去搜索一下a文件中是否包含。 因为 不用循环求合集上面的几种方法,都使用了循环来解决问题。都是比较符合我们的编程直觉的。但是,我们可以不可以不使用循环来解决问题呢? 答案是可以的,我找到了一个牛逼的命令 好,我们直接上手这个命令试试 comm a.txt b.txt
直接干了一下,发现好像不成。先要排序以及去重才行。 所以,修改命令如下: comm <(sort a.txt|uniq) <(sort b.txt|uniq)
执行结果如下: 1 11 12 2 3 4 5 6 7 8 9 第一列表示第一个文件独有的内容,第二列表示第二个文件独有的内容,第三列是共有的内容,也就是合集。 OK,我们在修改一下参数,只获取第三列,命令如下: comm -12 <(sort a.txt|uniq) <(sort b.txt|uniq)
好,输出的内容正是我们想要的。 其他补充
本文有 FungLeo 原创,允许转载,但转载必须保留首发链接。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |