linux join命令
类似数据库中的表join, 左连接, 右链接, 左右都显示的连接
- 只能join两个文件
- 主键列必须是排序好的
格式:
bash
Usage: join [OPTION]... FILE1 FILE2
# The default join field is the first, delimited by blanks.
# 默认以第一列作为Join字段, 以空格分割字段
-t 指定分隔符
-a 后面跟上文件编号, 比如-a1 -a2
-i 忽略大小写
-o 后面跟上输出的字段, 比如1.1第一个文件的第一列, 2.3 表示第二个文件的第三列
-e 把输出字段中没有的空白, 替换成指定的字符
-j 指定某一列作为join的主键列, 比如 -jx 等于 -1x -2x, 也就是指定两个文件的x列作为主列
-v 其中-v1是 左边有但右边没有的, -v2是右边有但是左边没有的
基本示例
准备数据:
bash
tee 1.txt <<EOF
1 January
2 February
3 March
13 Unknown
EOF
tee 2.txt <<EOF
1 一月
2 二月
3 三月
14 故意不对齐的十四月
EOF
交集
bash
join 1.txt 2.txt
# 示例输出
1 January 一月
2 February 二月
3 March 三月
left join
bash
join -a1 1.txt 2.txt
# 示例输出
1 January 一月
2 February 二月
3 March 三月
13 Unknown
right join
bash
join -a2 1.txt 2.txt
# 示例输出
1 January 一月
2 February 二月
3 March 三月
14 故意不对齐的十四月
左右全都要的join
bash
join -a1 -a2 1.txt 2.txt
# 示例输出
1 January 一月
2 February 二月
3 March 三月
13 Unknown
14 故意不对齐的十四月
以上输出不知道来自文件1还是文件2, 因此如下
bash
join -a1 -a2 -e '-' -o '1.1 1.2 2.1 2.2' 1.txt 2.txt
# 示例输出
1 January 1 一月
2 February 2 二月
3 March 3 三月
13 Unknown - -
- - 14 故意不对齐的十四月
一边有,另一边没有的
-v
参数
bash
join -v1 1.txt 2.txt
# 示例输出
13 Unknown
join -v2 1.txt 2.txt
# 示例输出
14 故意不对齐的十四月
思考问题
sed和awk如何实现join功能?