目录
内容来源:
【GUN】【join】指令介绍
【busybox】【join】指令介绍
【linux】【join】指令介绍
使用示例:
打印两个文件的共有行 - 默认输出
可以对字母排序
可以对数字排序
可以对字符串排序
打印两个文件的共有行 - 输出文件1或者文件2中不匹配的行
打印两个文件的共有行 - 检查文件是否排序,报错对应行(默认)
打印两个文件的共有行 - 文件未排序也会对比
此处后续碰到了再继续记录,现阶段到此为止
常用组合指令:
指令不常用/组合用法还需继续挖掘:
内容来源:
GUN : Coreutils - GNU core utilities
busybox v1.36.1 : 【busybox记录】【shell指令】基于的Busybox的版本和下载方式-CSDN博客
【GUN】【join】指令介绍
join:在一个公共字段上连接行
join 将具有相同join字段的每一对输入行写入到标准输出。
简介:
join [option]... file1 file2
file1或file2(但不能都是)都可以是` - `,即标准输入。file1和file2应该在关联字段上排序。
$ cat文件1
a 1
b 2
e 5
$ cat文件2
a X
e Y
f Z
$ join file1 file2
a 1 X
e 5 Y
join的默认行为(不提供任何选项时):
join字段是每行的第一个字段;
输入的字段由一个或多个空格分隔,前导空格被忽略;
输出的字段用空格分隔;
每一行输出包括join字段、file1剩余字段和file2剩余字段。
8.3.1通用选项
该程序接受以下选项。参见第2章[常见选项],第2页。
‘-a file-number’
除了正常输出外,打印文件file-number中每个不匹配的行(' 1 '或' 2 ')。
‘--check-order’
如果任何一个输入文件的顺序错误,则失败并返回错误信息。
‘--nocheck-order’
不要检查两个输入文件是否有序。这是默认值。
‘-e string’
用字符串替换输入中缺少的输出字段。例如,缺少用 -12jo选项指定的字段。
‘--header’
将每个输入文件的第一行作为标题行。标题行将被连接并作为第一个输出行打印。如果使用-o指定输出格式,则标题行将按照指定的格式打印出来。即使指定了--check-order,标题行也不会检查顺序。此外,如果每个文件的标题行不匹配,则将使用第一个文件的标题字段。
‘-i’
‘--ignore-case’
比较键时忽略大小写差异。有了这个选项,输入文件的行必须以相同的方式排序。使用`sort -f`来生成这种排序。
‘-1 field’
Join on field文件1的字段(正整数)。
‘-2 field’
Join on field文件2的字段(正整数)。
‘-j field’
等价于 -1 field -2 field.
‘-o field-list’
‘-o auto’
如果指定了关键字' auto ',则从每个文件的第一行推断输出格式。
这与默认的输出格式相同,但也确保了每行输出相同数量的字段。缺失的字段用-e选项替换,多余的字段被丢弃。
否则,根据字段列表的格式构造每个输出行。字段列表中的每个元素要么是单个字符'0',要么是形式为m.n,其中文件编号m为' 1 '或' 2 ',n是一个正数字段。
字段“0”表示连接字段。在大多数情况下,可以使用对应于连接字段的显式m.n来重现`0`字段规范的功能。然而,当打印不匹配的行(使用-a或-v选项)时,如果两个文件中都有不匹配的行,则无法使用m.n in field-list指定join字段。为了给join提供这种功能,POSIX发明了` 0 `字段规范表示法。
字段列表中的元素由逗号或空格分隔。空白分隔符通常需要在shell中引用。例如,命令join -o 1.2,2.2’ 和 ‘join -o '1.2 2.2'’是等价的。
所有输出行 - 包括那些因为-a或-v选项而打印的行 - 都受指定的字段列表的约束。
‘-t char’
使用字符作为输入和输出字段分隔符。将输入文件中出现的每个字符视为重要的。使用`sort -t char`,不使用`sort`的-b选项,来生成这种排序。如果指定了`join -t ''`,则会考虑整行,以匹配默认的排序操作。如果指定了'-t '\0'',则使用ASCII NUL字符来分隔字段。
‘-v file-number’
打印文件file-number中每一个不匹配的行(' 1 '或' 2 '),而不是正常的输出。
‘-z’
‘--zero-terminated’
用0字节而不是换行符分隔项(ASCII LF)。例如,将输入视为用ASCII NUL分隔的项目,并以ASCII NUL终止输出项目。此选项可以与` perl -0 `或` find -print0 `和` xargs -0 `一起使用,它们的作用相同,以便可靠地处理任意文件名(即使是包含空格或其他特殊字符的文件名)。使用-z,换行符被视为字段分隔符。
退出状态为零表示成功,非零值表示失败。
如果指定了--check-order选项,未排序的输入将导致致命的错误消息。
如果指定了--nocheck-order选项,未排序的输入将永远不会导致错误消息。如果这两个选项都没有给出,只有当发现输入文件包含不配对的行,并且两个输入文件都非空时,才会诊断出排序错误的输入。
如果输入文件被诊断为未排序,join命令将以非零状态退出(并且不应该使用输出)。
通过指定--nocheck-order强制join处理包含不配对行的错误排序的输入文件并不能保证产生任何特定的输出。输出可能与您希望的不一致。
8.3.2 先排序
join 要求输入文件经过排序。每个输入文件都应该根据join中使用的键(=字段/列号)排序。推荐的排序选项是`sort -k 1b,1`(假设所需的键在第一列)。
典型的用法:
$ sort -k 1b,1 file1 > file1.sorted
$ sort -k 1b,1 file2 > file2.sorted
$ join file1.sorted file2.sorted > file3
通常,排序顺序是由LC_COLLATE区域设置指定的排序序列。除非指定了-t选项,否则排序比较会忽略join字段开头的空格,如sort -b。如果指定了--ignore-case选项,那么排序比较会忽略join字段中字符的大小写,比如sort -f:
$ sort -k 1bf,1 file1 > file1.sorted
$ sort -k 1bf,1 file2 > file2.sorted
$ join --ignore-case file1.sorted file2.sorted > file3
如果将sort的输出提供给join,那么sort和join命令应该使用一致的区域设置和选项。你可以使用类似` sort -k 1b,1 `这样的命令对文件的默认连接字段进行排序,但如果你选择了非默认的区域设置、连接字段、分隔符或比较选项,那么你应该在连接和排序之间保持一致。
为了避免任何与语言环境相关的问题,建议对这两个命令都使用`C`语言环境:
$ LC_ALL=C sort -k 1b,1 file1 > file1.sorted
$ LC_ALL=C sort -k 1b,1 file2 > file2.sorted
$ LC_ALL=C join file1.sorted file2.sorted > file3
8.3.3处理字段
使用-1、-2为每个输入文件设置关键字段。确保前面的排序命令操作的是相同的字段。
下面的例子使用第一个文件的第7个字段和第二个文件的第3个字段的值来连接两个文件:
$ sort -k 7b,7 file1 > file1.sorted
$ sort -k 3b,3 file2 > file2.sorted
$ join -1 7 -2 3 file1.sorted file2.sorted > file3
如果两个文件的字段编号相同,则使用-j:
$ sort -k4b,4 file1 > file1.sorted
$ sort -k4b,4 file2 > file2.sorted
$ join -j4 file1.sorted file2.sorted > file3
sort和join都可以操作以空格分隔的字段。要指定不同的定界符,可以在两个中都使用-t:
$ sort -t, -k3b,3 file1 > file1.sorted
$ sort -t, -k3b,3 file2 > file2.sorted
$ join -t, -j3 file1.sorted file2.sorted > file3
要指定制表符(ascii 0x09)字符而不是空格,使用:1
$ sort -t$'\t' -k3b,3 file1 > file1.sorted
$ sort -t$'\t' -k3b,3 file2 > file2.sorted
$ join -t$'\t' -j3 file1.sorted file2.sorted > file3
如果指定了`join -t ''`,那么匹配默认排序操作的整行将被考虑:
$ sort file1 > file1.sorted
$ sort file2 > file2.sorted
$ join -t '' file1.sorted file2.sorted > file3
8.3.4控制join的字段匹配
为简洁起见,本节省略了sort命令。仍然需要在合并之前对文件进行排序。
join的默认行为是只打印两个输入文件共有的行。使用-a和-v可以打印一个或两个文件中不匹配的行。
下面的所有示例都使用了以下两个(预先排序的)输入文件:
$ cat file1 $ cat file2
a 1 a A
b 2 c C
Command Outcome
$ join file1 file2 common lines (intersection)
a 1 A
$ join -a 1 file1 file2 来自第一个文件的公共行和未配对行
a 1 A
b 2
$ join -a 2 file1 file2 来自第二个文件的公共行和未配对行
a 1 A
c C
$ join -a 1 -a 2 file1 file2 两个文件中的所有行(配对和非配对)(union)
a 1 A 见下文关于-o自动。
b 2
c C
$ join -v 1 file1 file2 第一个文件的未配对行(差异)
b 2
$ join -v 2 file1 file2 第二个文件中未配对的行(差异)
c C
$ join -v 1 -v 2 file1 file2 两个文件中未配对的行,省略公共行(对称差异)
b 2
c C
在处理不成对的行时,-o auto -e X选项很有用。下面的示例打印两个文件中的所有行(公用行和未配对的行)。没有-o auto,很难分辨哪些字段来自哪个文件:
$ join -a 1 -a 2 file1 file2
a 1 A
b 2
c C
$ join -o auto -e X -a 1 -a 2 file1 file2
a 1 A
b 2 X
c X C
如果输入没有不可配对的行,则有一个GNU扩展可用;排序顺序可以是当且仅当上述排序比较认为两个字段相等时认为它们相等的任何顺序。例如:
$ cat file1
a a1
c c1
b b1
$ cat file2
a a2
c c2
b b2
$ join file1 file2
a a1 a2
c c1 c2
b b1 b2
8.3.5标题行
当要关联的文件的标题行没有排序时,可以使用——header选项:
$ cat file1
Name Age
Alice 25
Charlie 34
$ cat file2
Name Country
Alice France
Bob Spain
$ join --header -o auto -e NA -a1 -a2 file1 file2
Name Age Country
Alice 25 France
Bob NA Spain
Charlie 34 NA
要对带有标题行的文件进行排序,请使用GNU sed -u。下面的例子对文件进行排序,但保留每个文件的第一行:
$ ( sed -u 1q ; sort -k2b,2 ) < file1 > file1.sorted
$ ( sed -u 1q ; sort -k2b,2 ) < file2 > file2.sorted
$ join --header -o auto -e NA -a1 -a2 file1.sorted file2.sorted > file3
8.3.6文件的并、交、差
将sort、uniq和join组合起来,对文件执行与set操作等价的操作:
Command outcome
sort -u file1 file2 未排序文件的合并
sort file1 file2 | uniq -d 未排序文件的交集
sort file1 file1 file2 | uniq -u 未排序文件的差值
sort file1 file2 | uniq -u 未排序文件的对称差值
join -t '' -a1 -a2 file1 file2 有序文件的并集
join -t '' file1 file2 排序文件的交集
join -t '' -v2 file1 file2 已排序文件的差异
join -t '' -v1 -v2 file1 file2 有序文件的对称差值
上面的所有例子都是针对整行而不是特定字段的:sort without -k和join -t都将整行作为键
【busybox】【join】指令介绍
NA
【linux】【join】指令介绍
[root@localhost bin]# join --help
用法:join [选项]... 文件1 文件2
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 blanks.
When FILE1 or FILE2 (not both) is -, read standard input.
-a FILENUM also print unpairable lines from file FILENUM, where
FILENUM is 1 or 2, corresponding to FILE1 or FILE2
-e EMPTY replace missing input fields with EMPTY
-i, --ignore-case ignore differences in case when comparing fields
-j FIELD equivalent to '-1 FIELD -2 FIELD'
-o FORMAT obey FORMAT while constructing output line
-t CHAR use CHAR as input and output field separator
-v 文件编号 类似 -a 文件编号,但禁止组合输出行
-1 域 在文件1 的此域组合
-2 域 在文件2 的此域组合
--check-order 检查输入行是否正确排序,即使所有输入行均是成对的
--nocheck-order 不检查输入是否正确排序
--header 将首行视作域的头部,直接输出而不对其进行匹配
-z, --zero-terminated line delimiter is NUL, not newline
--help 显示此帮助信息并退出
--version 显示版本信息并退出
Unless -t CHAR is given, leading blanks separate fields and are ignored,
else fields are separated by CHAR. Any FIELD is a field number counted
from 1. FORMAT is one or more comma or blank separated specifications,
each being 'FILENUM.FIELD' or '0'. Default FORMAT outputs the join field,
the remaining fields from FILE1, the remaining fields from FILE2, all
separated by CHAR. If FORMAT is the keyword 'auto', then the first
line of each file determines the number of fields output for each line.
Important: FILE1 and FILE2 must be sorted on the join fields.
E.g., use "sort -k 1b,1" if 'join' has no options,
or use "join -t ''" if 'sort' has no options.
Note, comparisons honor the rules specified by 'LC_COLLATE'.
If the input is not sorted and some lines cannot be joined, a
warning message will be given.
GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告 join 的翻译错误
完整文档请见:<https://www.gnu.org/software/coreutils/join>
或者在本地使用:info '(coreutils) join invocation'
使用示例:
打印两个文件的共有行 - 默认输出
可以对字母排序
指令: join test1.txt test2.txt
可以对数字排序
指令: join test11.txt test22.txt
可以对字符串排序
指令: join test111.txt test222.txt
打印两个文件的共有行 - 输出文件1或者文件2中不匹配的行
-a file-number 选项 指定输出哪个文件的不匹配行
指令: join -a 1 test111.txt test222.txt
指令: join -a 2 test111.txt test222.txt
打印两个文件的共有行 - 检查文件是否排序,报错对应行(默认)
--check-order 选项
test3.txt 是一个未排序的文件
指令: join test1.txt test3.txt
打印两个文件的共有行 - 文件未排序也会对比
--nocheck-order 选项
test3.txt 是一个未排序的文件,可以看到没有输出未排序的行
指令: join --nocheck-order test1.txt test3.txt
此处后续碰到了再继续记录,现阶段到此为止
常用组合指令:
NA