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 循环求合集
上面查了一下用 while read 这种方式读取每一行,所以用了 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 求合集
好了,上面都是逻辑非常简单的处理。那么有没有可能用一层的循环来解决问题呢?
答案是可以的。我们需要用到 grep 这个牛逼的工具。 grep 是一个强大的文本搜索工具,可以匹配正则来进行搜索。
那么逻辑就非常简单了。循环其中一个文件,把每一行的内容利用 grep 正则匹配另一个文件,如果有匹配,则输出。
代码如下:
for i in $(cat b.txt); do
grep "\<$i\>" a.txt
done
循环b文件,并且去搜索一下a文件中是否包含。
因为 grep 命令是把符合的输出出来,所以没必要 echo 一下了。
不用循环求合集
上面的几种方法,都使用了循环来解决问题。都是比较符合我们的编程直觉的。但是,我们可以不可以不使用循环来解决问题呢?
答案是可以的,我找到了一个牛逼的命令 comm 这个命令的解释是 select or reject lines common to two files ,可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集、求差、以及差集操作。
好,我们直接上手这个命令试试
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)
好,输出的内容正是我们想要的。
其他补充
- 在
unix思想中,一个程序只做一件事情。而我们把一个内容要进行去重处理,就必须进行两个操作:- 首先进行排序操作
sort - 然后把相邻并且相同的内容给去重
uniq
- 首先进行排序操作
- 当我们不知道一个命令是干嘛的时候,可以用
whatis xxx来进行查询 - 当
whatis不能满足我们的需求的时候,我们使用man xxx来进行更加详细的查看。 - 我们写的
*.sh文件如果希望直接运行,可以用chmod +x *.sh来赋予*.sh直接运行的权限。之后可以用./*.sh来执行 - 如果随便写写,不要求运行权限,可以
sh *.sh来运行脚本 - 这两种运行的结果是有差异的,具体自行参考这里。
本文有 FungLeo 原创,允许转载,但转载必须保留首发链接。
Shell 命令行求两个文件每行对比的相同内容的更多相关文章
- shell命令之根据字符串查询文件对应行记录
显示xxx字符串对应的行数,并向前打印3行,向后打印2行,查找对应文件为filename.txt 命令:grep -n 'xxx' -A3 -B2 --color=auto filename.txt ...
- 用shell求两个文件的差集
假设有两个文件a.file和b.file,分别代表集合A和集合B. a.file的内容如下: abcde b.file的内容如下: cdefg 可以用grep命令 grep命令是常用来搜索文本内容的, ...
- perl对比两个文件的行
perl对比两个文件的行 对比两个文件的各行,得到A与B相同的行/A与B不相同的行 主要功能 得到相同行 得到A中包含,B不包含的行 得到B中包含,A中不包含的行 具体执行情况 Perl代码 #!/u ...
- LINUX Shell 下求两个文件交集和差集的办法
http://blog.csdn.net/autofei/article/details/6579320 假设两个文件FILE1和FILE2用集合A和B表示,FILE1内容如下: a b c e d ...
- Linux 命令之split(将一个大文件根据行数平均分成若干个小文件)
把一个 txt 文件导入到 excel 中,但是 excel 单列支持的行数为 1048576,而我需要导入的 txt 文件总共有 7945674 ,我们无法一次性将整个 txt 文件里面的内容导入到 ...
- Linux命令(21)查看文件的行数
在 linux 系统中没有在 windows 系统中那么方便的点点鼠标就可以操作文件了,对文件的各种操作都必须使用各种命令来完成.比如有时候我们需要在不查看文件内容的情况下需要知道该文件有多少行.这个 ...
- shell 命令 if [ -d filename] 判断文件
作者:曹毅涵 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊 ...
- C#远程执行Linux系统中Shell命令和SFTP上传文件
一.工具:SSH.Net 网址:https://github.com/sshnet/SSH.NET 二.调用命令代码: Renci.SshNet.SshClient ssh = "); ss ...
- 每天学点Linux命令:倒叙打印文件第二行的前100个大写字母
sed -n | rev 处理第二行 grep:提取大写字母 o: 不显示非结果 tr:删除换行 Cut:截取1-100个字符 rev:逆序 断断续续搞了好长时间. ...
随机推荐
- ViewResolver和ResponseBody笔记
处理HttpResponseBody有两种方式,ViewResolver(视图解析器)和ResponseBody ViewResolver.View多用于jsp,ViewResolver的主要作用是把 ...
- 20145327实验五 Java网络编程
实验五 Java网络编程 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器, ...
- 学Git,用Git ①
本月开始接触到Git版本管理工具,觉得很有意思,在这里总结一下学习Git的一些心得体会. 要在Mac上完整的使用git进行版本管理,需要熟悉Mac终端操作命令和Git操作命令两种命令,索性两种命令加在 ...
- 用python打印99乘法口诀表
代码如下 #!/usr/bin/env python # encoding: utf-8 __author__ = 'Nicholas.Cage' i = 1 j = 1 while i <= ...
- zsh + oh-my-zsh 默认shell
项目地址 zsh -----> http://www.zsh.orgoh-my-zsh ----> http://ohmyz.sh The last shell you’ll ever n ...
- ScriptToApp FAQ
Q: What should i do when the system alert is displayed ? A: To make the generated app work, you ne ...
- webform CustomValidator
https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.customvalidator?view=netframew ...
- mybatis动态sql中的bind绑定
知识点:bind在模糊查询中的用法 在我的博客 mybatis中使用mysql的模糊查询字符串拼接(like) 中也涉及到bind的使用 <!-- List<Employee> ...
- 爬虫之动态HTML处理(Selenium与PhantomJS )动态页面模拟点击
动态页面模拟点击 #!/usr/bin/env python # -*- coding:utf-8 -*- # python的测试模块 import unittest from selenium im ...
- Linux段错误及GDB Coredump调试方法
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fa ...