- 浏览: 4754683 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
bzhao:
你也应该可以这样:(not tested)./rbtunnel ...
在Bash脚本中怎么关闭文件描述符? -
bzhao:
如果有A进程原代码情况下,通过如下调用,把他的子进程继承关闭则 ...
在Bash脚本中怎么关闭文件描述符? -
Master-Gao:
楼主咋没分析下源码呢?
我使用过的Linux命令之dirname - 截取给定路径的目录部分 -
jiedushi:
tail -F 就可以吧
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能 -
java_is_new:
新手学习了,就是不明白为一个网卡配多个ip有什么用
我使用过的Linux命令之ifconfig - 网络配置命令
我使用过的Linux命令之join - 根据关键字合并数据文件
本文链接:http://codingstandards.iteye.com/blog/796299 (转载请注明出处)
用途说明
Linux下最常用的数据文件格式是文本格式的,多个字段之间通过分隔符来区分,分隔符比如冒号(:)、制表符、空格等。/etc/passwd和/etc/group就是用:来分隔的,用MySQL的into outfile指令导出的数据通常是以制表符分隔的。这种文本格式既方便人去阅读,也适合程序处理,通常某列类似于数据库中的关键字。join命令就是一个根据关键字合并数据文件的命令(join lines of two files on a common field),类似于数据库中两张表关联查询。
常用参数
join命令根据公共字段(关键字)来合并两个文件的数据行。因此最简单的使用方式就是指定两个数据文件名,这两个文件的第一列就是公共字段,字段之间以空白分隔。(For each pair of input lines with identical join fields, write a line to standard output. The default join field is the first, delimited by whitespace. When FILE1 or FILE2 (not both) is -, read standard input.)
内连接(inner join) 格式:join <FILE1> <FILE2>
左连接(left join, 左外连接, left outer join) 格式:join -a1 <FILE1> <FILE2>
右连接(right join, 右外连接,right outer join) 格式:join -a2 <FILE1> <FILE2>
全连接(full join, 全外连接, full outer join) 格式:join -a1 -a2 <FILE1> <FILE2>
指定分隔符:
-t <CHAR>
比如:-t ':' 使用冒号作为分隔符。默认的分隔符是空白。
指定输出字段:
-o <FILENO.FIELDNO> ...
其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。
比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。
使用示例
示例一 内连接(忽略不匹配的行)
不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。
[root@rhel55 linux]# cat month_cn.txt
1 一月
2 二月
3 三月
4 四月
5 五月
6 六月
7 七月
8 八月
9 九月
10 十月
11 十一月
12 十二月
13 十三月,故意的
[root@rhel55 linux]# cat month_en.txt
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
14 MonthUnknown
注:注意两个文件的内容,中文版的多了十三月,英文版的多了14月,这纯粹是为了方便演示。
[root@rhel55 linux]# join month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
[root@rhel55 linux]#
示例二 左连接(又称左外连接,显示左边所有记录)
显示左边文件中的所有记录,右边文件中没有匹配的显示空白。
[root@rhel55 linux]# join -a1 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月,故意的
[root@rhel55 linux]#
示例三 右连接(又称右外连接,显示右边所有记录)
显示右边文件中的所有记录,左边文件中没有匹配的显示空白。
[root@rhel55 linux]# join -a2 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
14 MonthUnknown
[root@rhel55 linux]#
示例四 全连接(又称全外连接,显示左边和右边所有记录)
[root@rhel55 linux]# join -a1 -a2 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月,故意的
14 MonthUnknown
[root@rhel55 linux]#
示例五 指定输出字段
比如参数 -o 1.1 表示只输出第一个文件的第一个字段。
[root@rhel55 linux]# join -o 1.1 month_cn.txt month_en.txt
1
2
3
4
5
6
7
8
9
10
11
12
[root@rhel55 linux]# join -o 1.1 2.2 month_cn.txt month_en.txt
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
[root@rhel55 linux]# join -o 1.1 2.2 1.2 month_cn.txt month_en.txt
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[root@rhel55 linux]# join -o 1.1 2.2 1.2 1.3 month_cn.txt month_en.txt
<== 字段1.3并不存在
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[root@rhel55 linux]#
示例六 指定分隔符
[root@rhel55 linux]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:$1$K8WSIAfQ$9i1h6a4V1XeIn0lv.CT53/:14833:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:14833:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14833:0:99999:7:::
adm:x:3:4:adm:/var/adm:/sbin/nologin:*:14833:0:99999:7:::
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin:*:14833:0:99999:7:::
sync:x:5:0:sync:/sbin:/bin/sync:*:14833:0:99999:7:::
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown:*:14833:0:99999:7:::
halt:x:7:0:halt:/sbin:/sbin/halt:*:14833:0:99999:7:::
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin:*:14833:0:99999:7:::
news:x:9:13:news:/etc/news::*:14833:0:99999:7:::
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin:*:14833:0:99999:7:::
operator:x:11:0:operator:/root:/sbin/nologin:*:14833:0:99999:7:::
games:x:12:100:games:/usr/games:/sbin/nologin:*:14833:0:99999:7:::
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin:*:14833:0:99999:7:::
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin:*:14833:0:99999:7:::
nobody:x:99:99:Nobody:/:/sbin/nologin:*:14833:0:99999:7:::
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin:!!:14833:0:99999:7:::
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin:!!:14833:0:99999:7:::
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin:!!:14833:0:99999:7:::
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin:!!:14833:0:99999:7:::
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin:!!:14833:0:99999:7:::
pcap:x:77:77::/var/arpwatch:/sbin/nologin:!!:14833:0:99999:7:::
ntp:x:38:38::/etc/ntp:/sbin/nologin:!!:14833:0:99999:7:::
dbus:x:81:81:System message bus:/:/sbin/nologin:!!:14833:0:99999:7:::
avahi:x:70:70:Avahi daemon:/:/sbin/nologin:!!:14833:0:99999:7:::
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin:!!:14833:0:99999:7:::
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin:!!:14833:0:99999:7:::
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin:!!:14833:0:99999:7:::
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin:!!:14833:0:99999:7:::
avahi-autoipd:x:100:101:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin:!!:14833:0:99999:7:::
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin:!!:14833:0:99999:7:::
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin:!!:14833:0:99999:7:::
gdm:x:42:42::/var/gdm:/sbin/nologin:!!:14833:0:99999:7:::
sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin:!!:14833:0:99999:7:::
oracle:x:500:500::/opt/oracle:/bin/bash:$1$v64Pa.m.$GZMrQiOWCdQPF8XKtWju30:14833:0:99999:7:::
mysql:x:101:104:MySQL server:/var/lib/mysql:/bin/bash:!!:14866::::::
[root@rhel55 linux]#
问题思考
1. 怎样使用join命令实现两个文件中关键字的交集、并集、差集?
2. 怎样使用join命令中指定关键字的列,而非默认的第一列?
相关资料
【1】甜菜与咸菜 缺哪补哪,用技术武装自信 linux 的join命令--总结
【2】动态网站制作指南 深入浅出SQL之左连接、右连接和全连接
发表评论
-
在Linux用tar归档压缩文件时忽略某些文件和目录
2013-02-01 10:19 17055在Linux下,常用tar对文 ... -
使用nmap扫描服务器端口的一次操作
2012-11-01 17:00 15143使用nmap扫描服务器端口的一次操作 本文来自:http ... -
我使用过的Linux命令之wget - ooo
2011-09-14 13:10 0我使用过的Linux命令之wg ... -
推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
2011-09-09 12:53 9151简明 Vim 练级攻略 http://coolshell.c ... -
推荐一篇学习Vim使用的好文:酷壳 - 简明 Vim 练级攻略
2011-09-09 12:49 1简明 Vim 练级攻略 http://coolshell.c ... -
我使用过的Linux命令之:(冒号) - 啥也不做(除了……)
2011-08-29 13:18 12104我使用过的Linux命令之: ... -
我使用过的Linux命令之date - 显示、修改系统日期时间
2011-08-25 09:21 41986我使用过的Linux命令之da ... -
我使用过的Linux命令之declare - 声明shell变量(不知道没关系、知道了就更好的内建命令)
2011-08-16 09:22 21836我使用过的Linux命令之declare - 声明shell变 ... -
我使用过的Linux命令之alias - 设置命令的别名,让 Linux 命令更简练
2011-08-11 09:31 28831我使用过的Linux命令之alias - 设置命令的别名,让 ... -
我使用过的Linux命令之ar - 创建静态库.a文件
2011-08-08 10:40 51935我使用过的Linux命令之ar - 创建静态库.a文件 本 ... -
我使用过的Linux命令之crontab - 设置例行任务(类似于Windows中的任务计划)
2011-08-04 22:26 9754我使用过的Linux命令之crontab - 设置例行任务(类 ... -
我使用过的Linux命令之chmod - 改变文件/目录的访问权限
2011-08-03 21:33 10709我使用过的Linux命令之chmod - 改变文件/目录的访问 ... -
我使用过的Linux命令之export - 设置或显示环境变量
2011-08-02 19:55 25442我使用过的Linux命令之export - 设置或显示环境变量 ... -
我使用过的Linux命令之wc - 统计文件行数、单词数或字节数
2011-07-26 10:50 29020我使用过的Linux命令之wc - 统计文件行数、单词数或字节 ... -
我使用过的Linux命令之groupdel - 删除群组
2011-07-22 22:13 9695我使用过的Linux命令之gr ... -
我使用过的Linux命令之ifconfig - 网络配置命令
2011-07-21 20:43 60560我使用过的Linux命令之ifconfig - 网络配置命令 ... -
我使用过的Linux命令之ll - 列出文件/目录的详细信息
2011-07-20 21:22 7210我使用过的Linux命令之ll ... -
我使用过的Linux命令之mkdir - 创建目录
2011-07-20 20:58 13690我使用过的Linux命令之mkdir - 创建目录 本文链 ... -
我使用过的Linux命令之perror - 解释错误代码
2011-07-18 20:29 25084我使用过的Linux命令之perror - 解释错误代码 ... -
我使用过的Linux命令之ping - 测试与目标主机的连通性
2011-07-16 10:46 26617我使用过的Linux命令之ping - 测试与目标主机的连通性 ...
相关推荐
join 命令可以用于将多个文件的数据结合起来,例如将两个文件的数据结合起来,得到一个新的结果。 总结 通过对 sort、uniq 和 join 命令的实验学习,我们可以更好地理解这三个命令的用法和参数。这些命令是 Linux ...
这些命令是Unix/Linux系统中最常用的命令之一,它们为用户提供了一种高效且灵活的方式来管理文件、目录和系统资源。掌握这些命令对于任何使用Unix/Linux系统的开发者和管理员来说都是必不可少的技能。
34. **join**: 将两个文件中具有共同字段的行合并。 35. **grep**: 在文件中搜索匹配指定模式的行。 36. **uniq**: 过滤掉连续重复的行。 #### 文件压缩与解压缩 1. **tar**: 创建或提取归档文件。 2. **compress*...
本章节提供了Linux命令的快速查找表,帮助初学者快速定位到特定的命令及其使用方法。 ##### 指令与用语速查表 1. **ACL(Access Control List)**:位于第十四章第3.1节。ACL用于扩展传统的文件权限模型,允许对...
- 使用UNION或UNION ALL关键字合并多个查询的结果集。 7. **为表和字段取别名**: - 使用AS关键字为表名或字段名指定别名。 8. **使用正则表达式查询**: - REGEXP用于基于正则表达式的模式匹配。 #### 十、...
5. **join**:基于共同字段合并两个文件的行。适用于数据库操作。 6. **split**:将文件分割成多个较小的文件。`split [filename] [prefix]`,用于处理超大文件。 7. **csplit**:根据上下文行分割文件。适合于按...
- 配置文件中的关键设置包括但不限于:服务器端口、数据文件存储位置、最大连接数等。 **1.2 MySQL的基本使用** - **登录MySQL:** - 使用命令`mysql -u root -p`登录MySQL服务,其中`root`为用户名,输入密码后...
- JOIN操作:通过`JOIN`关键字合并多个表的数据,实现复杂查询。 - 子查询:嵌套SQL查询,用于获取满足特定条件的数据。 - 视图:虚拟表,基于一个或多个表的查询结果,提供安全和简化查询的机制。 5. 数据库...
4. **联接操作**:JOIN关键字用于合并两个或更多表的数据。例如,`INNER JOIN`返回两个表中匹配的行,`LEFT JOIN`返回左表的所有行,即使右表没有匹配。 5. **子查询**:一个查询嵌套在另一个查询内部,称为子查询...
根据所提供的文件内容,以下是对MySQL学习笔记的知识点进行详细的阐述: 第1章 数据库概述 - 数据存储方式:MySQL使用关系型数据库管理系统,以表格形式存储数据,表格由行(记录)和列(字段)组成。 - 数据库范式...
- **字段及数据类型的增删改移**:使用`ALTER TABLE`命令进行相应的操作。 - **更改表的存储引擎**:`ALTER TABLE table_name ENGINE = engine_name;` - **删除表的外键约束**:`ALTER TABLE table_name DROP ...
- **多表查询**:通过JOIN关键字将多个表的数据合并起来查询。 #### 七、获取数据库和表的信息 为了更好地管理和维护数据库,了解如何获取数据库和表的相关信息是非常重要的。 - **查看数据库列表**:使用SHOW ...
- JOIN操作用于合并多张表的数据,如INNER JOIN、LEFT JOIN、RIGHT JOIN等。 6. **索引优化**: - 索引可以极大地提高查询速度,BTree、Hash、全文索引等类型各有特点。 - 使用`EXPLAIN`关键字可以分析查询计划...
- **文件系统**:传统的数据管理方法之一,通过操作系统提供的文件管理功能来保存和检索数据。 - **数据库系统**:现代数据管理的主要方式,提供了一种更加组织化、标准化的方式来存储和管理数据。 **1.2 数据库...