【问题标题】:Python - Lookup a matching string in two large text files [closed]Python - 在两个大文本文件中查找匹配的字符串[关闭]
【发布时间】:2016-01-12 18:13:53
【问题描述】:

我试图在FILE2 的第二列中搜索FILE1 中的值,并在匹配时从FILE2 的第三列打印值。以下是我的文件和输出示例:

 FILE1:
1
2
3
4


FILE2:
0,1,Y,8
4,5,6,7
7,4,X,9

 OUTPUT:
Y
X

谁能帮我做这件事?

【问题讨论】:

  • 好的,你试过的时候哪里没用?
  • 嗨 arainone,我是 python 新手,我想我应该使用它;因为我的文件大约有 3M 行。不幸的是,由于大小问题,我无法使用任何熟悉的脚本!
  • 看看这里,也许你会找到处理大文件的好方法:stackoverflow.com/questions/19548193/…

标签: python linux awk lookup large-files


【解决方案1】:

如果您可以将第一个文件放入内存中,那么我会使用 awk 进行类似的操作:

awk -F, 'NR == FNR { a[$1]; next } $2 in a { print $3 }' file1 file2

这会将第一个文件中的第一个字段存储在数组a 中,然后在对应的第二个字段匹配时打印第二个文件中的第三个字段。

【讨论】:

  • 谢谢汤姆。实际上我考虑过 awk 作为一个选项,但是,第一个文件大约是 100MB,第二个是 300MB。我觉得不可能!
  • 在这种情况下,听起来您需要大约 100MB 的 RAM,这不是一个不合理的数量。
  • 正确,但我得到了一个零字节的输出文件。顺便说一句,我在 VM 中使用 linux,但是分配的 RAM 是 2GB!
  • 如果没有输出,则表明代码不起作用,可能是由于错误或您的示例与实际输入之间存在差异。
  • 我正在将相同的代码与我的文件样本一起应用,并且运行良好!生气:\
【解决方案2】:

join 的替代解决方案,文件需要在连接字段上排序。

$ join -t, -1 1 -2 2 file1 <(sort -t, -k2n file2) | cut -d, -f3
Y
X

【讨论】:

    【解决方案3】:

    以下是 Tom Fenech 出色答案的变体(优秀的部分原因是不需要排序),但优点是不需要测试“NR==FNR”。因此它可能会更快:

    awk -F, -v dict=FILE1 'BEGIN {while(getline<dict){a[$1]=1}}
     $2 in a {print $3}'
    

    当然,这也需要足够的内存来存储 FILE1 的哈希表,但正如已经指出的,如果 FILE1 只有 100MB,这应该不是问题。

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 2019-11-27
      • 1970-01-01
      • 2011-02-09
      • 2016-11-23
      • 2016-05-30
      • 1970-01-01
      • 2021-05-13
      • 2017-09-11
      相关资源
      最近更新 更多