如何根据列的匹配合并两个文件?

时间:2019-02-04 19:17:15

标签: python shell unix

我有两个文件,我要在其中创建第三个文件,其中包含所有信息,每一列都用制表符分隔。

文件1:

67      rule_ref: _avc ,output_tag: 'hello'
2       rule_ref: _cdf ,output_tag: 'hi'
334     rule_ref: _xyz ,output_tag: 'bye'
1       rule_ref: _abc ,output_tag: 'go'

文件2:

rule_ref: _avc ,output_tag: 'hello'     1
rule_ref: _cdf ,output_tag: 'hi'        4
rule_ref: _xyz ,output_tag: 'bye'    5

并想要一个 file3 ,例如:

67    1    rule_ref: _avc ,output_tag: 'hello'
2     4    rule_ref: _cdf ,output_tag: 'hi'
334   5    rule_ref: _xyz ,output_tag: 'bye'
1     0    rule_ref: _abc ,output_tag: 'go'

文件1的第二列与文件2的第一列匹配,文件3包含 file1的第一列,file2的第二列和file1的第三列。

我在Google上进行搜索,但没有找到解决此问题的结果。请帮助

2 个答案:

答案 0 :(得分:0)

首先,我假设您正在使用 Pandas Dataframe ,然后您只需要使用merge。

尝试一下:

file1.merge(file2, on='Column with same values', left_on='lkey', right_on='rkey')

文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

答案 1 :(得分:0)

考虑到SO食用制表符的方式,您很难说出列是什么。另一个字符将使其变得更容易。

但是,根据您的描述,我认为第一个文件中的数字是一列,而rule_ref: _avc ,output_tag: 'hello'等则是第二列?和第二个文件类似吗?但是您提到了第一个文件的第三列,该文件不存在该方案。你是说第二个吗?

如果是...

$ join -t $'\t' -1 2 -2 1 -a 1 -e 0 -o '1.1 2.2 1.2' <(sort -t $'\t' -k 2 file1.txt) <(sort -t $'\t' -k 1 file2.txt)
1   0   rule_ref: _abc ,output_tag: 'go'
67  1   rule_ref: _avc ,output_tag: 'hello'
2   4   rule_ref: _cdf ,output_tag: 'hi'
334 5   rule_ref: _xyz ,output_tag: 'bye'

({join要求将其加入的文件在适当的字段上进行排序,而您的示例不会在相应的字段上进行排序,因此进行了排序。还需要像bash这样的shell能够理解$'\t'。)