【问题标题】:Compare specific fields in two files -Python比较两个文件中的特定字段-Python
【发布时间】:2014-07-29 22:15:24
【问题描述】:

我想比较两个文件(file1 和 file2)的不同列,但前 4 列是相同的,输出应该是 file1 中存在的 file2 的行:

文件 1:

132.227.127.170 49163   173.194.40.110  443
132.227.127.170 49164   31.13.86.65 443
132.227.127.170 49165   193.51.224.40   443
132.227.127.170 49166   193.51.224.40   443
132.227.127.170 49167   193.51.224.40   443
......

文件 2:

132.227.127.170 49155 17.172.232.150 5223 3 4500.1587 106
132.227.127.170 49155 17.172.232.150 5223 3 8100.3275 106
132.227.127.170 49163 173.194.40.110 443 5 0.405 53
132.227.127.170 49164 31.13.86.65 443 7 0.018600000000000002 53
132.227.127.170 49165 193.51.224.40 443 417 42.5117 32362
132.227.127.170 49166 193.51.224.40 443 34 33.382 1236
132.227.127.170 49167 193.51.224.40 443 8 37.067099999999996 458
132.227.127.170 49168 193.51.224.40 443 5 0.0008 53
132.227.127.170 49169 193.51.224.40 443 5 0.0009 53
132.227.127.170 49170 31.13.86.65 443 937 30.7529 117540
......

输出:

132.227.127.170 49163 173.194.40.110 443 5 0.405 53
132.227.127.170 49164 31.13.86.65 443 7 0.018600000000000002 53
132.227.127.170 49165 193.51.224.40 443 417 42.5117 32362
132.227.127.170 49166 193.51.224.40 443 34 33.382 1236
132.227.127.170 49167 193.51.224.40 443 8 37.067099999999996 458
....

所以我尝试了这段代码,它通常可以工作,我已经在其他情况下尝试过并且工作得很好,但是我不知道这次出了什么问题!

import string 

tstFile1=open("output","w+")
with open('file1') as file1, open('file2') as file2:
    myf=[line.strip().split() for line in file1]
    f1=[line.strip() for line in filter(lambda x: x.strip().split()[0:3] in myf, file2)]
for i in f1:
    tstFile1.write("%s\n" %i)
tstFile1.close()

那么你建议我改变什么?任何帮助请 我尝试使用AWK命令,但仍然是同样的问题

【问题讨论】:

  • [0:3] 只对前三个切片。你可能想要[0:4]
  • 你期待什么输出?不清楚您认为问题出在哪里。
  • @ArtjomB。 [0:3] 表示取前 4 个相同的元素并仅比较其中的 4 个
  • 不在我的 python 版本中:[0,1,2,3,4][0:3] == [0,1,2]
  • @jonrsharpe 输出应该与 file2 类似,但仅显示 file1 中的行(即文件 'filtred')并显示 file2 中的行在 file1 中不存在(即'其他'文件)

标签: python parsing awk compare


【解决方案1】:

问题是你太花哨了。一个步骤太多了,很容易漏掉一些小细节。

file1 包含 4 列,但您只是从 file2 中提取前 3 列。

如果您更改以下行,您的问题将得到解决:

    f1=[line.strip() for line in filter(lambda x: x.strip().split()[0:4] in myf, file2)]

   f2=[line.strip() for line in filter(lambda x: x.strip().split()[0:4] not in myf, file2)]

将 [0:3] 更改为 [0:4](请记住,python 索引是 元素之间的)

但是请把这个逻辑分开,它会让调试大大更容易!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多