linux unix命令详解,linux/unix命令详解之join

本文详细介绍了Linux命令`join`的功能、语法及其参数含义,包括如何根据共同字段连接两个文件,如何处理缺失字段,以及如何自定义输出格式。`join`命令在处理数据关联时非常有用,但需注意输入文件需预先排序,且在使用-e和-o选项时需谨慎。示例展示了不同参数组合下的命令执行效果。
摘要由CSDN通过智能技术生成

NAME

join - join lines of two files on a common field

SYNOPSIS

join [OPTION]... FILE1 FILE2

DESCRIPTION

For each pair of input lines with identical join fields, write a line to standard output. The default join field

is the first, delimited by whitespace. When FILE1 or FILE2 (not both) is -, read standard input.

-a FILENUM

print unpairable lines coming from file FILENUM, where FILENUM is 1 or 2, corresponding to FILE1 or FILE2

-e EMPTY

replace missing input fields with EMPTY

-i, --ignore-case ignore differences in case when comparing fields

-j FIELD

equivalent to ‘-1 FIELD -2 FIELD’

-o FORMAT

obey FORMAT while constructing output line

-t CHAR

use CHAR as input and output field separator

-v FILENUM

like -a FILENUM, but suppress joined output lines

-1 FIELD

join on this FIELD of file 1

-2 FIELD

join on this FIELD of file 2

--help display this help and exit

--version

output version information and exit

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

语  法:join [-i][-a<1或2>][-e][-o][-t][-v<1或2>][-1][-2][--help][--version][文件1][文件2]

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

参  数:

-a<1或2> 就是可以 -a1 或者-a2 或者一起用。单独使用一个的话,则根据指定

的文件的关键字段进行连接,即指连接并且显示指定文件有的行。如-a1 即文件1有

的行才把文件2的内容链接过来并显示出来,-a2类似。如果-a1 -a2一起使用,则

两个文件有的行都会显示出来。

-e 若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中

的字符串。

-i或--igore-case 比较栏位内容时,忽略大小写的差异。

-o 按照指定的格式来显示结果。

-t 使用栏位的分隔字符。

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

-1 连接[文件1]指定的栏位。

-2 连接[文件2]指定的栏位。

--help 显示帮助。

--version 显示版本信息。

需要注意的是,使用join连接两个文件的相关字段,都需要先进行排序。如果连接的主字段有重复,则会导致两个文件相关行的排列组合,请确保这是你需要的结果。

另外如果你想使用-e 选项,需要使用-o选项来格式化列,负责-e是没有效果的。还有一点就是你会发现使用-e -o 进行全连接的话,两个文件的关键列都必须使用上,负责-e会把缺失的关键列那也填补上相应的字符,有时候这并非我们期望的,具体的请自己行试验测试。

个人认为这是join命令的一点瑕疵,他应该两个文件如果全连接或者左连接右连接出现单独的关键键都应该是关键键名称而不是-e补充。不过这个瑕疵可以用awk来弥补一下,倒是挺容易。我的修补代码附在最后。

样例:

现在假设两个文件 j1 , j2 内容如下:

j1:

1 a

2 b

3 c

5 e

j2:

1 A

2 B

5 E

6 F

命令效果如下:$ join j1 j2

1 a A

2 b B

5 e E

$ join -a1 j1 j2

1 a A

2 b B

3 c

5 e E

$ join -a2 j1 j2

1 a A

2 b B

5 e E

6 F

$ join -a2 -a1 j1 j2

1 a A

2 b B

3 c

5 e E

6 F

$ join -o 1.1,1.2,2.2 j1 j2 #1文件显示第一二列,2文件显示第二列

1 a A

2 b B

5 e E

$ join -1 1 -2 1 j1 j2 #设定关键字段为:1文件的第一个字段和2文件第一字段

1 a A

2 b B

5 e E

代码大意就是以文件1的第一个字段和文件2的第一个字段为关键字段进行全连接。然后awk来处理连接后的主字段合并成一列的善后工作。

join -a1 -a2 -1 1 -2 1 -e "0" -o 1.1,2.1,1.2,1.3,2.2,2.3 file1 file2 | awk '

BEGIN{ printf "insert into weibodata (action,count,usercount,backcount,backip,date) values";first=0;}

{

if(first!=0)

printf ",";

if($1 !=0)

printf "("$1",";

else printf "("$2",";

printf $3","$4","$5","$6")";

first=1;

}' date=$dateFlag > $dateFlag"sentBackCount.sql"

'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值