【问题标题】:How to merge two files based on the matching of columns?如何根据列的匹配合并两个文件?
【发布时间】:2019-06-28 14:11:05
【问题描述】:

我有两个文件,我想从中创建第三个文件,其中包含所有信息,每列由制表符分隔。

文件 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'

file1 的第 2 列与 file2 的第 1 列匹配,并且 file3 包含 file1 的第 1 列,file2 的第 2 列和 file1 的第 3 列。

我在谷歌上搜索,但没有找到任何结果来解决这个问题。请帮忙

【问题讨论】:

    标签: python shell unix


    【解决方案1】:

    考虑到 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 要求它连接的文件在适当的字段上进行排序,而您的示例没有,因此进行排序。还需要一个能够理解 $'\t' 的 shell,例如 bash。)

    【讨论】:

      【解决方案2】:

      首先,我假设你使用的是 Pandas Dataframe,那么你只需要使用合并。

      试试这个:

      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

      【讨论】:

      • 不,我没有使用 Pandas 感谢@Lucas 的回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多