0%

join命令

一、常用用法

1
join [-t CHAR] [-i] [--header] [-1 FIELD] [-2 FIELD] [-e STR] FILE1 FILE2

二、含义与选项

2.1、含义

存在两个已排序文件,假如文件1中的某条记录的某个字段值(默认是第一个字段,从1开始计数)与文件2中的某条记录的某个字段值(默认是第一个字段,从1开始计数)一致,那么在最终打印结果中,将这两条记录拼接成一条记录。

2.2、选项表示的意思

“-t CHAR”:以“CHAR”字符作为记录内字段间的分隔符,默认的分隔符是“空格符”
“-i”:两个字段值比较时,忽略大小写
“–header”:两个文件的第一行作为说明行,不参与比较
“-1 FIELD”:FILE1中以第“FIELD”个字段作为比较字段
“-2 FIELD”:FILE2中以第“FIELD”个字段作为比较字段
“-e STR”:在最终的拼接记录中,如果某个字段的值为空,那么以“STR”替换
“FILE1”:文件1
“FILE2”:文件2

三、实验

3.1、实验1

有文件“a.txt”和“b.txt”,内容分别如下:

1
2
a 1
b 2
1
2
a 3
b 4

执行以下命令,得到如图1所示结果:

1
join a.txt b.txt

图1

3.2、实验2

有文件“a.txt”和“b.txt”,内容分别如下:

1
2
a;1
b;2
1
2
a;3
b;4

执行以下命令,得到如图2所示结果:

1
join -t ';' a.txt b.txt

图2

3.3、实验3

有文件“a.txt”和“b.txt”,内容分别如下:

1
2
A 1
b 2
1
2
a 3
b 4

执行以下命令,得到如图3所示结果:

1
join -i a.txt b.txt

图3

3.4、实验4

有文件“a.txt”和“b.txt”,内容分别如下:

1
2
3
Col1 Col2
a 1
b 2
1
2
3
Col3 Col4
a 3
b 4

执行以下命令,得到如图4所示结果:

1
join --header a.txt b.txt

图4

3.5、实验5

有文件“a.txt”和“b.txt”,内容分别如下:

1
2
a 1 f
b 2 g
1
2
f 3 5
g 4 6

执行以下命令,得到如图5所示结果:

1
join -1 3 -2 1 a.txt b.txt

图5

3.6、实验6

有文件“a.txt”和“b.txt”,内容分别如下:

1
2
a 
b 2
1
2
a 3
b 4

执行以下命令,得到如图6所示结果:

1
join -e "hello world" a.txt b.txt

图6

四、其他

4.1、“LC_COLLATE”等环境变量

由于涉及到两个字符串的比较等,故而程序实现中使用“LC_COLLATE”等环境变量,最终结果受到“LC_COLLATE”等环境变量的控制。

4.2、排序策略

跟“comm”命令一样,join命令实现设定的排序策略是“按照字典序排序”。因而,两个文件“已排序”应该是按照字典序已排序,否则执行join命令得到的结果很有可能不能符合预期。


参考文献

[1]man join

您的支持将鼓励我继续分享!