AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 417554
Accepted
Ole Tange
Ole Tange
Asked: 2018-01-17 08:11:58 +0800 CST2018-01-17 08:11:58 +0800 CST 2018-01-17 08:11:58 +0800 CST

计算文件中每一行的 md5sum

  • 772

给定一个文件,如:

a
b
c

如何获得如下输出:

a       0cc175b9c0f1b6a831c399e269772661
b       92eb5ffee6ae2fec3ad71c777531578f
c       4a8a08f09d37b73795649038408b5f33

以一种有效的方式?(输入为 80 GB)

hashsum gnu-parallel
  • 3 3 个回答
  • 3627 Views

3 个回答

  • Voted
  1. RomanPerekhrest
    2018-01-17T09:56:04+08:002018-01-17T09:56:04+08:00

    除了@Ole Tange 的方法,这里有一个优化的解决方案(Python 的部分):

    md5summer.py脚本:

    #!/usr/bin/python
    
    import sys
    import hashlib
    
    for r in sys.stdin:
        if r.strip():
            h = hashlib.md5()
            h.update(r.encode());
            print r, '\t', h.hexdigest()
    

    优化点:

    • hashlib- 使用实际库而不是已弃用的库
    • for r in sys.stdin:- 从类似生成器的对象而不是列表中读取
    • if r.strip():- 检查空记录以避免冗余hashlib方法调用

    用法:

    parallel --pipepart -a my80gb-file -S server1,server2 --block 1 /path_to/md5summer.py
    

    样本输出:

    a   0cc175b9c0f1b6a831c399e269772661
    b   92eb5ffee6ae2fec3ad71c777531578f
    c   4a8a08f09d37b73795649038408b5f33
    d   8277e0910d750195b448797616e091ad
    f   8fa14cdd754f91cc6554c9e71929cce7
    e   e1671797c52e15f763380b45e841ec32
    g   b2f5ff47436671b6e533d8dc3614845d
    h   2510c39011c5be704182423e3a695e91
    i   865c0c0b4ab0e063e5caa3387c1a8741
    j   363b122c528f54df4a0446b6bab05515
    k   8ce4b16b22b58894aa86c421e8759df3
    l   2db95e8e1a9267b7a1188556b2013b33
    m   6f8f57715090da2632453988d9a1501b
    n   7b8b965ad4bca0e41ab51de7b31363a1
    p   83878c91171338902e0fe0fb97a8c47a
    o   d95679752134a2d9eb61dbd7b91c4bcc
    q   7694f4a66316e53c8cdd9d9954bd611d
    r   4b43b0aee35624cd95b910189b3dc231
    s   03c7c0ace395d80182db07ae2c30f034
    t   e358efa489f58062f10dd7316b65649e
    u   7b774effe4a349c6dd82ad4f4f21d34c
    v   9e3669d19b675bd57058fd4664205d2a
    w   f1290186a5d0b1ceab27f4e77c0c5d68
    x   9dd4e461268c8034f5c8564e155c67a6
    y   415290769594460e2e485922904f345d
    z   fbade9e36a3f36d3d676c1b808451dd7
    ...
    
    • 3
  2. Best Answer
    Kjetil S.
    2019-08-03T08:27:15+08:002019-08-03T08:27:15+08:00

    这可能只是 perl 中的一个单行器:

    head 80gb | perl -MDigest::MD5=md5_hex -nlE'say"$_\t".md5_hex($_)'
    a       0cc175b9c0f1b6a831c399e269772661
    b       92eb5ffee6ae2fec3ad71c777531578f
    c       4a8a08f09d37b73795649038408b5f33
    d       8277e0910d750195b448797616e091ad
    e       e1671797c52e15f763380b45e841ec32
    f       8fa14cdd754f91cc6554c9e71929cce7
    g       b2f5ff47436671b6e533d8dc3614845d
    h       2510c39011c5be704182423e3a695e91
    i       865c0c0b4ab0e063e5caa3387c1a8741
    j       363b122c528f54df4a0446b6bab05515
    

    如果您需要存储输出并在咀嚼这个大块时想要一个漂亮的进度条:

    sudo apt install pv          #ubuntu/debian
    sudo yum install pv          #redhat/fedora
    pv 80gb | perl -MDigest::MD5=md5_hex -nlE'say"$_\t".md5_hex($_)' | gzip -1 > 80gb-result.gz
    
    • 3
  3. Ole Tange
    2018-01-17T08:11:58+08:002018-01-17T08:11:58+08:00

    首先制作一个单线程程序 ( md5er),它可以在给定输入的情况下生成正确的输出:

    #!/usr/bin/python
    
    import sys
    import hashlib
    
    for r in sys.stdin:
      print r[:-1], '\t', hashlib.md5(r[:-1]).hexdigest()
    

    然后使用 GNU Parallel 将输入拆分为可以分发到计算服务器的块:

    parallel --pipepart -a my80gb-file -Sworker1,worker2,worker3,: --block -10 md5er
    
    • 2

相关问题

  • 我可以在没有 gnu 并行的情况下同时提取我的 git 存储库吗?

  • 为什么 `md5sum` 没有给出与 Internet 相同的哈希值?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve