使用awk使用sha1sum进行散列

用户名

我有一个大约20列的“管道分隔”文件。我只想使用sha1sum哈希第一列,该列是类似于帐号的数字,并按原样返回其余列。

使用awk或sed做到这一点的最佳方法是什么?

Accountid|Time|Category|.....
8238438|20140101021301|sub1|...
3432323|20140101041903|sub2|...
9342342|20140101050303|sub1|...

上面是仅显示3列的文本文件的示例。只有第一列在其上实现了哈希函数。结果应为:

Accountid|Time|Category|.....
104a1f34b26ae47a67273fe06456be1fe97f75ba|20140101021301|sub1|...
c84270c403adcd8aba9484807a9f1c2164d7f57b|20140101041903|sub2|...
4fa518d8b005e4f9a085d48a4b5f2c558c8402eb|20140101050303|sub1|...
n0741337

这是一个可以执行所需操作的awk可执行脚本:

#!/usr/bin/awk -f

BEGIN { FS=OFS="|" }

FNR != 1 { $1 = encodeData( $1 ) }

47

function encodeData( fld ) {
    cmd = sprintf( "echo %s | sha1sum", fld )
    cmd | getline output
    close( cmd )
    split( output, arr, " " )
    return arr[1]
    }

这是流程分解:

  • 将输入和输出字段分隔符设置为 |
  • 当该行不是第一行(标题行)时,请重新分配$1给已编码的值
  • 47为true时,打印整行(始终)

这是encodeData功能分解:

  • 创建一个cmd将数据馈送到sha1sum
  • 喂给 getline
  • 关上 cmd
  • 在我的系统上,之后还有其他信息sha1sum,因此我通过split查看输出将其丢弃
  • 返回sha1sum输出的第一个字段

使用您的数据,我得到以下信息:

Accountid|Time|Category|.....
104a1f34b26ae47a67273fe06456be1fe97f75ba|20140101021301|sub1|...
c84270c403adcd8aba9484807a9f1c2164d7f57b|20140101041903|sub2|...
4fa518d8b005e4f9a085d48a4b5f2c558c8402eb|20140101050303|sub1|...

通过调用awk.script data(或./awk.script data如果您bash)运行

EdMorton编辑:抱歉,您的编辑是正确的方法,但是您上面的脚本是正确的方法,但是需要进行一些调整以使其更强大,并且比尝试在评论中描述它们要容易得多:

$ cat tst.awk
BEGIN { FS=OFS="|" }

NR==1 { for (i=1; i<=NF; i++) f[$i] = i; next }
{ $(f["Accountid"]) = encodeData($(f["Accountid"])); print }

function encodeData( fld,       cmd, output ) {
    cmd = "echo \047" fld "\047 | sha1sum"
    if ( (cmd | getline output) > 0 ) {
        sub(/ .*/,"",output)
    }
    else {
        print "failed to hash " fld | "cat>&2"
        output = fld
    }
    close( cmd )
    return output
}
$ awk -f tst.awk file
104a1f34b26ae47a67273fe06456be1fe97f75ba|20140101021301|sub1|...
c84270c403adcd8aba9484807a9f1c2164d7f57b|20140101041903|sub2|...
4fa518d8b005e4f9a085d48a4b5f2c558c8402eb|20140101050303|sub1|...

f[]阵列由硬编码字段需要被散列的数量,为您的功能额外的参数使其本地和在每次调用所以总是零/零,则解耦脚本if的函数getline意味着你不会回到以前的如果失败,则为成功值(请参阅http://awk.info/?tip/getline),其余的可能是更多的样式/首选项,并且性能有所改善。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用awk使用sha1sum进行哈希

来自分类Dev

将“ sha1sum”传递到“ tar”输出时使用不同的哈希码

来自分类Dev

使用GET方法将sha1sum插入curl的URL

来自分类Dev

文件的R sha1sum

来自分类Dev

目录中文件的sha1sum

来自分类Dev

比较tarball与sha1sum

来自分类Dev

目录中文件的sha1sum

来自分类Dev

即使我不进行任何修改,提交sha1sum也会被更改

来自分类Dev

使用链表进行散列

来自分类Dev

如何使sha1sum在Mac OS X上运行?

来自分类Dev

kali.org上的Sha1Sum

来自分类Dev

在git-bash(MinGW)上安装sha1sum

来自分类Dev

在python3中使用SHA1散列不会产生相同的结果

来自分类Dev

如何使用密码散列进行加密

来自分类Dev

如何使用密码散列进行加密

来自分类Dev

Java SHA1输出与Linux的sha1sum命令不同

来自分类Dev

带有sha1和sha1sum的hashdeep创建不同的结果

来自分类Dev

AWK使用散列合并两个文件

来自分类Dev

Git哈希输出与sha1sum不匹配,为什么?

来自分类Dev

为什么这些重复的SD卡的内容具有不同的sha1sum?

来自分类Dev

sha1sum报告相对于openssl的不同哈希值

来自分类Dev

为什么sha1sum在相同输入下的行为不同?

来自分类Dev

如何在sh shell中用sha1sum透明替换shasum?

来自分类Dev

命令行中的sha1sum与其他来源不同

来自分类Dev

sha1sum函数如何为您提供唯一的哈希?

来自分类Dev

验证 sha1sum 并打印损坏文件的目录和文件名

来自分类Dev

进行散列时使用哈希表作为参数吗?

来自分类Dev

循环使用符号将散列与数组进行比较

来自分类Dev

在 redis 中使用集合中的散列进行排序