基于公共字段连接两个文件

基于公共字段连接两个文件

我试图根据两个文件的公共字段将两个文件连接在一起,并使用命令将其输出到文件中join

文件一:

C01:Nancy:Jones:[email protected] 
C02:Barbara:Madison:[email protected] 
C03:Tim:Adams:[email protected]
C04:Sarah:Moore:[email protected]
C05:John:Polk:[email protected]
C06:Paula:Jacobs:[email protected]

文件2:

R001:07/04/15:123.45:C01
R002:12/20/15:167.50:C03
R003:03/14/16:298.00:C06
R005:09/15/16:36.50:C03
R005:11/27/16:58.00:C02
R006:02/28/17:72.98:C05 

预期输出

C01:Nancy:Jones:[email protected]:R001:07/04/15:123.45
C02:Barbara:Madison:[email protected]:R005:11/27/16:58.00
C03:Tim:Adams:[email protected]:R002:12/20/15:167.50
C03:Tim:Adams:[email protected]:R004:09/15/16:36.5
C05:John:Polk:[email protected]:R006:02/28/17:72.9
C06:Paula:Jacobs:[email protected]:R003:03/14/16:298.00

我尝试File2先根据字段 4 进行排序,然后将其输出到新文件

sort -t: -k 4 File2 > File22  

然后加入

join -t: -1 1 -2 4 -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' File1 File22 > File 3  

但我总是得到一个空白的输出文件。我也不确定如何处理遗漏第 4 行fromFile1以及这个事实C03在 中出现了两次File2

答案1

您需要做两件事才能让事情按照您想要的方式运行。首先,通过附加> File 3到命令末尾,您可以将输出重定向到命令,File并将额外的参数添加3join命令中。

为了解释为什么会发生这种情况,我最近(巧合的是!)回答了类似的问题重定向手册页的奇怪行为。基本上,它与 Bash 语法有关,您可以在 中阅读更多相关信息man bash

要修复该行为,您应该确保输出文件中没有空格,或者您应该转义空格,或者您应该用引号将文件名引起来。以下任何重定向都可以:

... > File3
... > File\ 3
... > "File 3"

现在解决输出中丢失的记录。这是由-a标志处理的。从man join

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

综上所述,以下命令对我有用(我将使用tee而不是重定向来显示输出):

$ join -t: -1 1 -2 4 -o '1.1 1.2 1.3 1.4 2.1 2.2 2.3' -a 1 File1 <(sort -t: -k4 File2) | tee "File 3"
C01:Nancy:Jones:[email protected] :R001:07/04/15:123.45
C02:Barbara:Madison:[email protected] :R005:11/27/16:58.00
C03:Tim:Adams:[email protected]:R002:12/20/15:167.50
C03:Tim:Adams:[email protected]:R005:09/15/16:36.50
C04:Sarah:Moore:[email protected]:::
C05:John:Polk:[email protected]:::
C06:Paula:Jacobs:[email protected]:R003:03/14/16:298.00

答案2


与米勒http://johnkerl.org/miller/doc/reference.html命令是

mlr --csv --implicit-csv-header --headerless-csv-output --fs ":" join --ul -l 4 -r 1 -j 4 --lp l --rp r -f file2.csv file1.csv

你有

C01:R001:07/04/15:123.45:Nancy:Jones:[email protected]
C02:R005:11/27/16:58.00:Barbara:Madison:[email protected]
C03:R002:12/20/15:167.50:Tim:Adams:[email protected]
C03:R005:09/15/16:36.50:Tim:Adams:[email protected]
C05:R006:02/28/17:72.98:John:Polk:[email protected]
C06:R003:03/14/16:298.00:Paula:Jacobs:[email protected]

相关内容