返回首页 两个月精通 Shell 脚本

shell 学习第十五天----join 连接字段

使用 join 连接字段

join 命令将多个文件结合起来,每个人建立的每条记录,都共享一个键值,键值指的是记录中的珠子段,通常会是用户名称,个人形式,员工编号之类的数据。

语法:

join [options...] file1 file2

主要选项

  • -1 field1
  • -2 field2
    标明要结合的字段。 -1 field 指的是从 file1 取出 field1,而 -2field2 指的则为从 file2 取出 field2。 字段编号自 1 开始,而非 0。
  • -o file.field
    输出 file 文件中的 field 字段。 一般的字段则不打印。 除非使用多个 -o 选项,即可显示多个输出字段。
  • -t separator
    使用 separator 作为输入字段分割字符,而非使用空白。 次字符也为输出的字段分割字符。

行为模式

读取 file1 与 file2,并根据共同键值结合多笔记录。默认以空白分隔字段。输出结果则包括共同键值,来自 file1 的其余记录,接着 file2 的其余记录 (指除了键值外的记录)。若 file1 位 -,则 join 会读取标准输入,每个文件的第一个字段是用来结合的默认键值; 可以使用 -1 与 -2 更改键值。默认情况下,在两个文件中未含键值的行将不打印。

Linux join 命令用于将两个文件中,指定栏位内容相同的行连接起来。

找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

例如:

我有两个文件: 文件 aa 和文件 bb

aa 的内容为:

joe 100  
jane 200  
herman 300  
chris 400

bb 的内容为:

joe 20  
jane  10  
herman 30  
chris 98  

每条记录都有两个字段:业务员的名字和销售量。为了让 join 运行得到正确结果,输入文件必须先完成排序.

编写下列脚本:

\#!/bin/sh
\#jointest.sh
\#删除注释并排序数据文件
sed ‘/^#/d’ aa | sort > aa.sorted
sed ‘/^#/d’ bb | sort > bb.sorted
\#以第一个键值做结合,将结果产生至标准输出
join aa.sorted bb.sorted
\#删除缓存文件
rm aa.sorted bb.sorted
保存退出
chmod +x jointest.sh
./jointest.sh

输出结果如下所示:

chris 400 98  
herman 300 30  
jane 200 10  
joe 100 20  

首先使用 sed 删除注释,然后再排序个别文件。排序后的缓存缓存文件称为 join 命令的输入数据,最后删除缓存文件.sed 的删除还记得吗?

sed '/^#/d' bb

这里的意思是说把 bb 文件里以#开头的行删除