从 coreutils 的手册中得知join
-e string
将输入中缺少的输出字段替换为字符串。即,缺少使用 -12jo 选项指定的字段。
我根本不明白这个选项。以下内容是什么意思
“输入中缺少的输出字段”
“缺少用 -12jo 选项指定的字段”?
谢谢。
答案1
稍微神秘的字符串-12jo
指的是四个单独的选项-1
、-2
和,其中前三个与选择每个文件中要加入-j
的-o
字段有关,最后一个与应输出每个文件中的哪些字段有关。该-j
选项是 GNU 中的扩展join
,并且与(其中是某个整数)-j n
相同。-1 n -2 n
n
当您使用 请求获取时,该-e
选项生效-a
未配对的您加入的一个或两个文件中的行。未配对的行将丢失数据,因为一个文件中的行与另一个文件中的行不对应。该-e
选项用给定的字符串替换这些字段。同样,如果您使用 请求-o
文件中特定行上不存在的字段,则可以使用-e
字符串替换空值。
示例:两个文件包含多种产品的制造成本和销售收入。每个文件都有字段
- 产品编号
- 产品名称
- 一些数字
$ cat expenses.txt
1 teacup 5
2 spoon 7
3 bowl 10
$ cat sales.txt
1 teacup 30
2 spoon 24
为了得到费用和所有产品的销售,同时替换字符串中可能丢失的数字(来自第一个或第二个文件)NONE
,我会这样做
$ join -a1 -a2 -o0,1.2,1.3,2.3 -e NONE expenses.txt sales.txt
1 teacup 5 30
2 spoon 7 24
3 bowl 10 NONE
在这里,我使用该-a
选项两次来请求两个文件中的所有行(SQL 中的“完全外连接”)。该-o
选项用于从每个文件中获取特定字段(字段0
是连接字段,默认情况下是每个文件中的第一个字段),并指定用于替换缺失值的-e
字符串。NONE
正如您所看到的,我们得到的NONE
是“销售价值”,因为第二个文件中没有提到 ID 为 3 的产品。