Linux join 命令:文件合并

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/join("File Joining") subgraph Lab Skills linux/cd -.-> lab-219193{{"Linux join 命令:文件合并"}} linux/join -.-> lab-219193{{"Linux join 命令:文件合并"}} end

理解数据文件

让我们从检查员工数据文件的内容开始。我们有两个文件: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 操作

现在我们已经了解了数据,接下来让我们使用 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 命令后指定字段编号来实现这一点。

尝试以下命令:

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 表示“输出格式”
  • 1.2 表示第一个文件中的第二个字段(姓名)
  • 1.3 表示第一个文件中的第三个字段(部门)
  • 2.2 表示第二个文件中的第二个字段(薪资)
  • 1.1 表示第一个文件中的第一个字段(员工 ID)

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

处理未匹配的记录

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

将以下员工添加到 employees.txt

echo "1006 Alex IT" >> employees.txt

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

现在,如果我们运行基本的 join 命令:

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)中无法匹配的行。当你希望查看一个文件中的所有记录,即使它们在另一个文件中没有匹配项时,这非常有用。

基于不同字段进行 Join

到目前为止,我们一直基于第一个字段(员工 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 可以成为合并和分析不同文件信息的有力工具。

资源