使用特定字段作为键加入

join using a specific field as key

我想在 section.dat 中找到与 "Database Engineering" 课程相对应的所有部分。为此,我想以课程号为键加入result1.datsection.dat,只保留需要的字段,并将中间结果保存到名为result2.dat.[=22的文件中=]

我已经创建了 result1.dat 文件,但我不确定用于将它与 section.dat 文件连接的 Unix 命令。我知道结果文件中我需要的行是第 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

你必须告诉join一些事情:

  • 连接使用哪些字段([=14=第一个,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(但我可以写)。

如您所见,这将两条线连接在一起并删除了连接字段,因此它只出现一次。您可以 select 使用 -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