Linux命令:join
连接:菜鸟教程-join介绍
join
命令用于将两个文件的共同字段进行匹配,并将它们合并为一行输出。
语法
join [选项]... 文件1 文件2
参数
-a FILENUM
:打印未匹配到的行,其中FILENUM
表示文件编号(1或2)。-o 格式
: 按照指定格式构造输出行-e EMPTY
:指定未匹配到的字段的占位符。-i
:忽略大小写进行匹配。-t CHAR
:指定字段分隔符。-v FILENUM
:仅打印未匹配到的行,其中FILENUM
表示文件编号(1或2)。-1 FIELD
:指定文件1中用于匹配的字段。-2 FIELD
:指定文件2中用于匹配的字段。
实例
假设我们有两个文件,一个是包含学生信息的文件students.txt
,另一个是包含成绩信息的文件scores.txt
。
students.txt:
cat >students.txt<<EOF
ID,Name
1,John
2,Lisa
3,David
4,Sarah
EOF
scores.txt:
cat >scores.txt<<EOF
ID,Score
2,85
3,92
4,78
5,88
EOF
现在我们想要将这两个文件根据学生的ID进行匹配,输出学生的姓名和成绩。
命令如下:
join -t ',' -1 1 -2 1 students.txt scores.txt
或者
join -t ',' students.txt scores.txt
结果如下:
ID,Name,Score
2,Lisa,85
3,David,92
4,Sarah,78
解释:
-t ','
:指定字段分隔符为逗号。-1 1
:指定文件1中的第1个字段进行匹配。-2 1
:指定文件2中的第1个字段进行匹配。
上面相当于内连接(忽略不匹配的行):不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。
左连接(又称左外连接,显示左边所有记录)
join -t ',' -a1 students.txt scores.txt
ID,Name,Score
1,John
2,Lisa,85
3,David,92
4,Sarah,78
显示左边文件中的所有记录,右边文件中没有匹配的显示空白。
右连接(又称右外连接,显示右边所有记录)
join -t ',' -a2 students.txt scores.txt
ID,Name,Score
2,Lisa,85
3,David,92
4,Sarah,78
5,88
显示右边文件中的所有记录,左边文件中没有匹配的显示空白。
全连接(又称全外连接,显示左边和右边所有记录)
join -t ',' -a1 -a2 students.txt scores.txt
ID,Name,Score
1,John
2,Lisa,85
3,David,92
4,Sarah,78
5,88
使用-o
选项指定输出的字段顺序:
join -t ',' -o 2.1,2.2,1.2 -1 1 -2 1 students.txt scores.txt
输出:
ID,Score,Name
2,85,Lisa
3,92,David
4,78,Sarah
使用-e
选项指定未匹配到的字段的占位符:
join -t ',' -o 1.1,1.2,2.2 -e 'NULL' -a1 -a2 students.txt scores.txt
输出:
ID,Name,Score
1,John,NULL
2,Lisa,85
3,David,92
4,Sarah,78
NULL,NULL,88
使用-v
选项仅打印未匹配到的行:
join -t ',' -v1 -v2 students.txt scores.txt
输出:
1,John
5,88