散列文本文件中每一行的第一列,并将其写入文件的第三列

时间:2019-03-12 15:31:21

标签: awk sed replace hash

我有一个具有以下格式的文件:

Value1 = Value1 <Value1>
Value2 = Value2 <Value2>
value3 = Value3 <Value3>

我想编写一个脚本,将每行中的第一个Value字段作为输入并计算其哈希值,然后将其写入{{1}右侧的相应字段中} 标志。我所有的输入值都是明文。

这样我最终得到这样的东西:

=

到目前为止,我已经使用了以下帮助:

Value1 = 7EE5A281B28D7CA1FAB06B43D0B7D8AC <7EE5A281B28D7CA1FAB06B43D0B7D8AC>
Value2 = 0FE13ED1638DA4D4B1EF316729F3BB32 <0FE13ED1638DA4D4B1EF316729F3BB32>
Value3 = 121BCEF76AA7694F7D8EF4D381B86DAD <121BCEF76AA7694F7D8EF4D381B86DAD>

它将以下内容写入我的输出文件:

awk '{cmd=sprintf("echo -n \"%s\"|md5sum",$3); 
   cmd|getline $3;close(cmd)}7' file

这几乎是完整的解决方案,但我需要将哈希复制到“ <>”字符之间以及之前的值字段中(这是一个电子邮件地址字段,但我可以将其替换为用户名哈希我的情况)。我还需要在要删除的字段之间写上“-”字符。

我如何才能使其完美工作?

谢谢

2 个答案:

答案 0 :(得分:0)

假设您将执行md5哈希,此gawk单行代码为您提供了一个开始:

awk '{cmd=sprintf("echo -n \"%s\"|md5sum",$3);
         cmd|getline $3;close(cmd)}7' file

答案 1 :(得分:0)

也许是这样的:

awk '{cmd="echo -n " $3 " | md5sum"; if( (cmd | getline md5) > 0 ) {close(cmd);sub(/ .*/,"",md5);md5=toupper(md5)};$3=md5;$4="<" md5 ">";}1' file
Value1 = 7EE5A281B28D7CA1FAB06B43D0B7D8AC <7EE5A281B28D7CA1FAB06B43D0B7D8AC>
Value2 = 0FE13ED1638DA4D4B1EF316729F3BB32 <0FE13ED1638DA4D4B1EF316729F3BB32>
value3 = 121BCEF76AA7694F7D8EF4D381B86DAD <121BCEF76AA7694F7D8EF4D381B86DAD>

鉴于<>内部和外部的值都保证相同...

如果您安装了ruby,这是一种难看但可能更有效的方法:

ruby -rdigest -lane 'md5=Digest::MD5.hexdigest($F[2]).upcase;$F[2]=md5;$F[3]="<" + md5 + ">"; print $F.join " "' file