Linux重要命令-join(按两个文件的相同字段合并)

功能说明:将两个文件中,指定栏位内容相同的行连接起来。 

    语  法:join [-i][-a<1或2>][-e<字符串>][-o<格式>] [-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help] [--version][文件1][文件2] 

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

    参  数: 
   
    -a<1或2>   除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。 
   
    -e<字符串>   若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。 
   
    -i或--igore-case   比较栏位内容时,忽略大小写的差异。 
   
    -o<格式>   按照指定的格式来显示结果。 
   
    -t<字符>   使用栏位的分隔字符。 
   
    -v<1或2>   跟-a相同,但是只显示文件中没有相同栏位的行。 
   
    -1<栏位>   连接[文件1]指定的栏位。 
   
    -2<栏位>   连接[文件2]指定的栏位。 
   
    --help   显示帮助。 

    --version   显示版本信息。

复制代码

指定输出字段:
-o <FILENO.FIELDNO> ...
其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。
比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。

复制代码

使用示例
示例一 内连接(忽略不匹配的行)
不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。
[root@rhel55 linux]# cat month_cn.txt 
1       一月
2       二月
3       三月
4       四月
5       五月
6       六月
7       七月
8       八月
9       九月
10      十月
11      十一月
12      十二月
13      十三月,故意的 
[root@rhel55 linux]# cat month_en.txt 
1       January
2       February
3       March
4       April
5       May
6       June
7       July
8       August
9       September
10      October
11              November
12      December
14      MonthUnknown
注:注意两个文件的内容,中文版的多了十三月,英文版的多了14月,这纯粹是为了方便演示。 
[root@rhel55 linux]# join month_cn.txt month_en.txt  
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
[root@rhel55 linux]#
示例二 左连接(又称左外连接,显示左边所有记录)
显示左边文件中的所有记录,右边文件中没有匹配的显示空白。
[root@rhel55 linux]# join -a1 month_cn.txt month_en.txt   
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月,故意的 
[root@rhel55 linux]#
 
示例三 右连接(又称右外连接,显示右边所有记录)
显示右边文件中的所有记录,左边文件中没有匹配的显示空白。
[root@rhel55 linux]# join -a2 month_cn.txt month_en.txt  
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
14 MonthUnknown 
[root@rhel55 linux]#
 
示例四 全连接(又称全外连接,显示左边和右边所有记录)
[root@rhel55 linux]# join -a1 -a2 month_cn.txt month_en.txt 
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月,故意的
14 MonthUnknown 
[root@rhel55 linux]#
 
示例五 指定输出字段
比如参数 -o 1.1 表示只输出第一个文件的第一个字段。
[root@rhel55 linux]# join -o 1.1 month_cn.txt month_en.txt 
1
2
3
4
5
6
7
8
9
10
11
12
[root@rhel55 linux]# join -o 1.1 2.2 month_cn.txt month_en.txt   
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
[root@rhel55 linux]# join -o 1.1 2.2 1.2 month_cn.txt month_en.txt 
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[root@rhel55 linux]# join -o 1.1 2.2 1.2 1.3 month_cn.txt month_en.txt   <== 字段1.3并不存在 
1 January 一月 
2 February 二月 
3 March 三月 
4 April 四月 
5 May 五月 
6 June 六月 
7 July 七月 
8 August 八月 
9 September 九月 
10 October 十月 
11 November 十一月 
12 December 十二月 
[root@rhel55 linux]#
 
示例六 指定分隔符
用root身份,将/etc/passwd与/etc/shadow 相关的数据整合成一列
[root@www ~]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$1$K8WSIAfQ$9i1h6a4V1XeIn0lv.CT53/:14833:0:99999:7:::99:7:::
bin:*:14833:0:99999:7:::
daemon:*:14833:0:99999:7::: 
#由输出的数据可以发现这两个文件的最左边字段都是账号,且以:分割

[root@www ~]# join -t ':' /etc/passwd /etc/shadow 
root:x:0:0:root:/root:/bin/bash:$1$K8WSIAfQ$9i1h6a4V1XeIn0lv.CT53/:14833:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin:*:14833:0:99999:7:::
daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:14833:0:99999:7:::

#通过上面这个操作,我们可以将两个文件的第一字段相同者整合成一行,第二个文件的相同字段并不会显示(因为已经在第一行了)。

示例7:我们知道/etc/passwd的第四个字段是GID,那个GID记录在/etc/group 当中的第三个字段,请问如何将两个文件整合?

root@zhouwj-virtual-machine:~# head -n 3 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

==> /etc/group <==
root:x:0:
daemon:x:1:
bin:x:2:

#从上面可以看到,确实有相同的部分,赶紧来整合一下!

root@zhouwj-virtual-machine:~# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:
1:daemon:x:1:daemon:/usr/sbin:/usr/sbin/nologin:daemon:x:
2:bin:x:2:bin:/bin:/usr/sbin/nologin:bin:x:

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

#join在处理两个相关的数据文件时,很有帮助。
 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python的os和shutil库来实现将两个TXT文件相同文件名进行合并的操作。具体的代码如下: ``` python import os import shutil # 设置两个文件夹路径 folder1 = "path/to/folder1" folder2 = "path/to/folder2" # 获取两个文件夹中的TXT文件列表 files1 = [f for f in os.listdir(folder1) if os.path.isfile(os.path.join(folder1, f)) and f.endswith(".txt")] files2 = [f for f in os.listdir(folder2) if os.path.isfile(os.path.join(folder2, f)) and f.endswith(".txt")] # 遍历其中一个文件夹中的TXT文件,查找相同文件名的文件并进行合并 for file1 in files1: for file2 in files2: if file1 == file2: # 获取文件路径和文件名 file1_path = os.path.join(folder1, file1) file2_path = os.path.join(folder2, file2) new_file_path = os.path.join(folder1, file1) new_file_name = os.path.splitext(file1)[0] + "_merged.txt" new_file_path = os.path.join(folder1, new_file_name) # 打开两个文件,并将内容写入新文件 with open(file1_path, "r") as f1, open(file2_path, "r") as f2, open(new_file_path, "w") as new_file: new_file.write(f1.read()) new_file.write(f2.read()) # 删除原来的两个文件 os.remove(file1_path) os.remove(file2_path) # 重命名新文件 os.rename(new_file_path, os.path.join(folder1, file1)) ``` 这段代码会遍历文件夹1中的TXT文件,查找文件夹2中是否有同名文件,如果有则将两个文件合并,然后删除原来的两个文件并重命名新文件。最终,文件夹1中的TXT文件就包含了两个文件夹中相同文件名的文件合并结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值