使用特定字段作为键加入

时间:2016-02-07 02:57:27

标签: shell unix join key

我想找到section.dat中与“数据库工程”课程相对应的所有部分。为此,我希望使用课程编号作为键加入result1.dat section.dat,只保留所需的字段并将中间结果保存到名为result2.dat的文件中。

我已经创建了result1.dat文件,但我不确定Unix命令是否将section.dat文件加入其中。我知道生成的文件中需要的行是第4行和第4行。 5;我需要用作密钥的课程编号为cs350

result1.dat

cs350#Database Engineering#3.0#math229

section.dat

1#cs110#2010#Spring#MWF#9:00#10:15
2#cs300#2009#Spring#TuTh#11:00#12:15
3#cs305#2009#Fall#MW#11:00#12:15
4#cs350#2009#Spring#TuTh#15:30#16:45
5#cs350#2010#Fall#MWF#15:00#15:50
6#cs440#2008#Fall#TuTh#14:00#15:15
7#math130#2008#Fall#MW#13:00#13:50
8#math229#2009#Spring#MTuWThF#9:00#9:50
9#math329#2010#Spring#MWF#9:00#10:15

我相信命令会是这样的:

join (unsure of middle information) result1.dat section.dat > result2.dat

1 个答案:

答案 0 :(得分:1)

你必须告诉join一些事情:

  • 用于加入的字段(result1.dat的第一个字段,section.dat的第二个字段)
  • 如何分隔字段(使用#
  • 加入后要保留哪些字段

这里是命令的样子,输出:

$ join -t '#' -2 2 result1.dat section.dat
cs350#Database Engineering#3.0#math229#4#2009#Spring#TuTh#15:30#16:45
cs350#Database Engineering#3.0#math229#5#2010#Fall#MWF#15:00#15:50

-t '#'定义字段分隔符,-2 2告诉join第二个文件中的相关字段是第二个。默认是第一个字段,所以我没有必要写-1 1 -2 2(但我可以)。

如您所见,这会将两条线连接在一起并移除连接字段,因此它只出现一次。您可以使用-o选项选择要进入结果的字段;假设您只需要文件一中的前两个字段以及文件二中的第三个和第四个字段,那么它将是-o '1.1 1.2 2.3 2.4'

$ join -t '#' -2 2 -o '1.1 1.2 2.3 2.4' result1.dat section.dat
cs350#Database Engineering#2009#Spring
cs350#Database Engineering#2010#Fall

如您所知,要将结果导入新文件,您可以使用

join -t '#' -2 2 -o '1.1 1.2 2.3 2.4' result1.dat section.dat > result2.dat