字符转换命令join

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

语法:

join [options] [file1] [file2]

参数:

-a<1/2> : 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行;

-e<字符串> : 若file1与file2中找不到指定的栏位,则在输出中填入选项中的字符串;

-i/–igore-case : 比较栏位内容时,忽略大小写的差异;

-o<格式> : 按照指定的格式来显示结果;

-t<字符> : 使用栏位的分隔字符;

-v<1/2> : 跟-a相同,但是只显示文件中没有相同栏位的行;

-1<栏位> : 连接file1指定的栏位;

-2<栏位> : 连接file2指定的栏位;

 

<1>用root身份将/etc/passwd /etc/shadow 相关数据整合成一列

# join -t ‘:’ /etc/passwd /etc/shadow | head -3

root:x:0:0:root:/root:/bin/bash:$6$hOA3C.gi$hmyBAktEkjBhL7jNLj1p5ifJwysguv7YBd1eAKialhjnj/KWOwQL/RdJWGti3FGrNu0.G0GAMRuxj5pxU/anR.:16881:0:99999:7:::

bin:x:1:1:bin:/bin:/sbin/nologin:*:15628:0:99999:7:::

daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:15628:0:99999:7:::

由输出的数据可以发现两个文件的最左边字段都是账号,且以”:”分隔.

通过上面的这个操作,可以将两个文件中的第一个字段相同者整合成一行.

第二个文件对的相同字段并不会显示(因为在第一行了).

 

<2> /etc/passwd 的第四段是GID,而在/etc/group当中是第三段,那我们又如何能将这两个文件整合成一行呢?

# join -t ‘:’ -1 4 /etc/passwd -2 3 /etc/group | head -3

0:root:x:0:root:/root:/bin/bash:root:x:

1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:bin,daemon

2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:bin,daemon

同样,相同的字段部分被移动到最前面了,所以第二个文件的内容就不显示了.

 

<3>使用-a/-v显示不匹配行

# cat 01.txt

1 aa

2 bb

3 cc

# cat 02.txt

1 11

2 22

4 33

使用-a选项,显示01.txt/02.txt中不匹配的行,

# join -a 1 01.txt 02.txt

1 aa 11

2 bb 22

3 cc

# join -a 2 01.txt 02.txt

1 aa 11

2 bb 22

4 33

而使用-v选项,只显示01.txt/02.txt中不匹配的行,

# join -v 1 01.txt 02.txt

3 cc

# join -v 2 01.txt 02.txt

4 33

 

<4>使用-o,指定格式来显示文件

# join -o 1.2 2.2 01.txt 02.txt

aa 11

bb 22

通过上面操作,来显示第一个文件的第二个域,第二个文件的第二个域.