join 看字面上的意义 (加入/参加) 就可以知道,他是在处理两个文件之间的数据,而且,主要是在处理『两个文件当中,有 "相同数据" 的那一行,才将他加在一起』的意思。我们利用底下的简单例子来说明:

[root@www ~]# join [-ti12] file1 file2
选项与参数:
-t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据,
如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
- :这个是数字的 ,代表『第一个文件要用那个字段来分析』的意思;
- :代表『第二个文件要用那个字段来分析』的意思。 范例一:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏
[root@www ~]# head -n /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin ==> /etc/shadow <==
root:$$/3AQpE5e$y9A/D0bh6rElAs:::::::
bin:*:::::::
daemon:*:::::::
# 由输出的数据可以发现这两个文件的最左边字段都是账号!且以 : 分隔 [root@www ~]# join -t ':' /etc/passwd /etc/shadow
root:x:::root:/root:/bin/bash:$$/3AQpE5e$y9A/D0bh6rElAs:::::::
bin:x:::bin:/bin:/sbin/nologin:*:::::::
daemon:x:::daemon:/sbin:/sbin/nologin:*:::::::
# 透过上面这个动作,我们可以将两个文件第一字段相同者整合成一行!
# 第二个文件的相同字段并不会显示(因为已经在第一行了嘛!) 范例二:我们知道 /etc/passwd 第四个字段是 GID ,那个 GID 记录在
/etc/group 当中的第三个字段,请问如何将两个文件整合?
[root@www ~]# head -n /etc/passwd /etc/group
==> /etc/passwd <==
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin ==> /etc/group <==
root:x::root
bin:x::root,bin,daemon
daemon:x::root,bin,daemon
# 从上面可以看到,确实有相同的部分喔!赶紧来整合一下! [root@www ~]# join -t ':' - /etc/passwd - /etc/group
:root:x::root:/root:/bin/bash:root:x:root
:bin:x::bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
:daemon:x::daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
# 同样的,相同的字段部分被移动到最前面了!所以第二个文件的内容就没再显示。
# 请读者们配合上述显示两个文件的实际内容来比对!

  这个 join 在处理两个相关的数据文件时,就真的是很有帮助的啦! 例如上面的案例当中,我的 /etc/passwd, /etc/shadow, /etc/group 都是有相关性的, 其中 /etc/passwd, /etc/shadow 以账号为相关性,至于 /etc/passwd, /etc/group 则以所谓的 GID (账号的数字定义) 来作为他的相关性。根据这个相关性, 我们可以将有关系的数据放置在一起!这在处理数据可是相当有帮助的!

  此外,需要特别注意的是,在使用 join 之前,你所需要处理的文件应该要事先经过排序 (sort) 处理! 否则有些比对的项目会被略过呢!特别注意了!

  参考资料:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash.php#join

最新文章

  1. 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长
  2. Python初学的易犯错误
  3. 第 30 章 使用 Emmet 插件
  4. guava学习--集合2&amp;Range
  5. Scala中的match(模式匹配)
  6. backbone-todo案例分析
  7. move和转发
  8. scala学习笔记(8): 列表的map,flatMap,zip和reduce
  9. eclipse下mysql编程
  10. Sencha Touch Guide
  11. Keil 的调试命令、在线汇编与断点设置
  12. AngularJs + ASP.NET MVC
  13. python 日历
  14. RabbitMQ阻塞读取时数据时,关闭channel引起的问题和解决方案
  15. [Spark内核] 第30课:Master的注册机制和状态管理解密
  16. APK Multi-Tool强大的APK反编译工具终极教程
  17. 关于crontab
  18. python学习笔记-调用接口
  19. Servlet过滤器和监听器配置范例
  20. Codeforces Round #533 (Div. 2)

热门文章

  1. [Git] Undo a commit that has already been pushed to the remote repository
  2. windows系统tomcat日志输出至catalina.out配置说明
  3. docker toolbox在win7下的安装
  4. Ant详解之-path、classpath和fileset
  5. C++ 第九课 标准c数学函数
  6. [转] Compile、Make和Build的区别
  7. python获取PING结果
  8. 小程序 video 组件同层渲染公测
  9. arm-linux 裸机下 VNC 的实现
  10. Java生成XML文件与XML文件的写入