Linux join 命令:文件合并

LinuxBeginner
立即练习

介绍

在本实验中,你将学习如何使用 Linux 中的 join 命令来合并来自多个文件的数据。我们将模拟一个场景:你正在一家公司的 HR 部门工作,需要合并来自不同数据库的员工信息。通过这个实际练习,你将领略到 join 命令在处理数据任务时的强大功能和灵活性。

这是一个引导实验,提供了逐步指导来帮助你学习和练习。请仔细按照说明完成每个步骤,以获得实践经验。历史数据表明,这是一个入门级实验,完成率为 98%。它获得了学习者 99% 的好评率。

了解数据文件

首先,让我们查看一下员工数据文件的内容。我们有两个文件:employees.txtsalaries.txt

首先,切换到项目目录:

cd /home/labex/project

此命令将你的当前工作目录更改为 /home/labex/project。后续的所有操作都将在此目录中进行。

现在,让我们查看 employees.txt 的内容:

cat employees.txt

cat 命令用于显示文件内容。你应该会看到类似这样的输出:

1001 John Engineering
1002 Sarah Marketing
1003 Mike Sales
1004 Emily HR
1005 David Finance

每一行代表一名员工,包含其 ID、姓名和部门。

接下来,让我们看看 salaries.txt

cat salaries.txt

输出应该类似于:

1001 75000
1002 65000
1003 70000
1004 60000
1005 80000

该文件包含员工 ID 及其对应的薪水。

这些文件代表了独立的数据库,我们将使用 join 命令将它们合并。

基础合并操作

既然我们已经了解了数据,现在就使用 join 命令根据员工 ID 合并这两个文件中的信息。

运行以下命令:

join employees.txt salaries.txt

你应该会看到如下输出:

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000

让我们分析一下发生了什么:

  1. join 命令检查了两个文件中的第一个字段(员工 ID)。
  2. 当它找到匹配的 ID 时,就会将两个文件中的行合并在一起。
  3. 输出显示了员工 ID,接着是来自 employees.txt 的所有字段,然后是来自 salaries.txt 的所有字段(ID 除外,因为它是重复的)。

这让我们可以通过一行内容完整地查看每位员工的信息。当你需要将分散在多个文件中的数据整合在一起进行查看或分析时,join 命令特别有用。

自定义合并输出

有时,我们可能希望更改输出中字段的顺序,或者只包含特定的字段。我们可以通过在 join 命令后指定字段编号来实现这一点。

尝试这个命令:

join -o 1.2,1.3,2.2,1.1 employees.txt salaries.txt

你应该会看到:

John Engineering 75000 1001
Sarah Marketing 65000 1002
Mike Sales 70000 1003
Emily HR 60000 1004
David Finance 80000 1005

让我们拆解一下 -o 选项:

  • -o 代表「输出格式」(output format)。
  • 1.2 表示第一个文件的第二个字段(姓名)。
  • 1.3 表示第一个文件的第三个字段(部门)。
  • 2.2 表示第二个文件的第二个字段(薪水)。
  • 1.1 表示第一个文件的第一个字段(员工 ID)。

这允许我们自定义输出信息的顺序。当你需要为特定的报告格式重新排列数据,或者只需要每个文件中的某些字段时,这个功能非常实用。

处理未匹配的记录

在现实场景中,你可能会遇到某个文件中的记录在另一个文件中没有对应匹配项的情况。让我们通过添加一名尚未分配薪水的员工来模拟这种情况。

将这名员工添加到 employees.txt

echo "1006 Alex IT" >> employees.txt

>> 运算符会将新行追加到文件末尾,而不会覆盖现有内容。

现在,如果我们运行基础的合并命令:

join employees.txt salaries.txt

你会发现 Alex 没有出现在输出中,因为 salaries.txt 中没有匹配的记录。

为了包含未匹配的记录,我们可以使用 -a 选项:

join -a 1 employees.txt salaries.txt

现在你应该能在输出中看到 Alex 了:

1001 John Engineering 75000
1002 Sarah Marketing 65000
1003 Mike Sales 70000
1004 Emily HR 60000
1005 David Finance 80000
1006 Alex IT

-a 1 选项告诉 join 包含第一个文件(employees.txt)中无法配对的行。当你想要查看一个文件中的所有记录,即使它们在另一个文件中没有匹配项时,这个选项非常有用。

基于不同字段进行合并

到目前为止,我们一直根据第一个字段(员工 ID)来合并文件。但如果我们想根据不同的字段进行合并呢?当你的文件结构不同,或者你需要根据 ID 以外的共同属性合并数据时,这会非常有用。

让我们创建一个名为 departments.txt 的新文件,其中包含部门代码:

cat << EOF > departments.txt
Engineering ENG
Marketing MKT
Sales SLS
HR HRS
Finance FIN
IT ITS
EOF

此命令创建了一个新文件 departments.txt,其中包含部门名称及其对应的代码。

现在,让我们根据部门名称将其与 employees.txt 文件合并:

join -1 3 -2 1 employees.txt departments.txt

你应该会看到:

Engineering 1001 John ENG
Marketing 1002 Sarah MKT
Sales 1003 Mike SLS
HR 1004 Emily HRS
Finance 1005 David FIN
IT 1006 Alex ITS

让我们拆解这个命令:

  • -1 3 告诉 join 使用第一个文件(employees.txt)的第三个字段作为合并字段。
  • -2 1 告诉它使用第二个文件(departments.txt)的第一个字段作为合并字段。

这允许我们基于任何共同字段合并文件,而不仅仅是第一列。当你的文件结构各异但共享某些共同信息时,这尤其有用。

总结

在本实验中,你学习了如何在 Linux 中使用 join 命令来合并来自多个文件的数据。我们探索了 join 的几个关键特性:

  • 基于共同字段对两个文件进行基础合并。
  • 使用 -o 选项自定义输出顺序。
  • 使用 -a 选项包含未匹配的记录。
  • 使用 -1-2 选项基于第一列以外的字段进行合并。

本实验未涵盖的其他 join 选项包括:

  • -t CHAR:使用 CHAR 作为输入和输出的字段分隔符。
  • -i:在比较字段时忽略大小写差异。
  • -e STRING:用 STRING 替换缺失的输入字段。
  • -j FIELD:等同于 -1 FIELD -2 FIELD
  • -v FILE_NUMBER:类似于 -a FILE_NUMBER,但只显示无法合并的行。

join 命令是 Linux 中处理数据的强大工具,能够让你高效地整合来自多个源的信息。当你继续在 Linux 环境中处理数据时,请记住 join 是合并和分析不同文件信息的宝贵工具。

资源