一、常用用法
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 | a 1 |
1 | a 3 |
执行以下命令,得到如图1所示结果:
1 | join a.txt b.txt |
图1
3.2、实验2
有文件“a.txt”和“b.txt”,内容分别如下:
1 | a;1 |
1 | a;3 |
执行以下命令,得到如图2所示结果:
1 | join -t ';' a.txt b.txt |
图2
3.3、实验3
有文件“a.txt”和“b.txt”,内容分别如下:
1 | A 1 |
1 | a 3 |
执行以下命令,得到如图3所示结果:
1 | join -i a.txt b.txt |
图3
3.4、实验4
有文件“a.txt”和“b.txt”,内容分别如下:
1 | Col1 Col2 |
1 | Col3 Col4 |
执行以下命令,得到如图4所示结果:
1 | join --header a.txt b.txt |
图4
3.5、实验5
有文件“a.txt”和“b.txt”,内容分别如下:
1 | a 1 f |
1 | f 3 5 |
执行以下命令,得到如图5所示结果:
1 | join -1 3 -2 1 a.txt b.txt |
图5
3.6、实验6
有文件“a.txt”和“b.txt”,内容分别如下:
1 | a |
1 | a 3 |
执行以下命令,得到如图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