awk用哈希值替换列

时间:2011-11-06 00:32:20

标签: shell sed awk

如何在awk或sed中用哈希值(如MD5)替换列?

原始文件非常庞大,所以我需要这个非常有效。

5 个答案:

答案 0 :(得分:4)

所以,你真的不想用awk这样做。任何流行的高级脚本语言 - Perl,Python,Ruby等 - 都会以更简单,更健壮的方式实现。话虽如此,这样的事情也会奏效。

给出这样的输入:

this is a test

(例如,有四列的行),我们可以用它的md5校验和替换给定列,如下所示:

awk '{
    tmp="echo " $2 " | openssl md5 | cut -f2 -d\" \""
tmp | getline cksum
$2=cksum
print
}' < sample 

这依赖于GNU awk(你可能在Linux系统上默认使用它),它使用openssl来生成md5校验和。我们首先在tmp中构建一个shell命令行,将所选列传递给md5命令。然后我们将输出传递给cksum变量,并用校验和替换第2列。鉴于上面的示例输入,此awk脚本的输出将为:

this 7e1b6dbfa824d5d114e96981cededd00 a test

答案 1 :(得分:3)

我复制了粘贴的larsks的回复,但我添加了关闭行,以避免此帖中指出的问题:gawk / awk: piping date to getline *sometimes* won't work

awk '{
    tmp="echo " $2 " | openssl md5 | cut -f2 -d\" \""
tmp | getline cksum
close(tmp)
$2=cksum
print
}' < sample 

答案 2 :(得分:2)

这可能使用Bash / GNU sed:

<<<"this is a test" sed -r 's/(\S+\s)(\S+)(.*)/echo "\1 $(md5sum <<<"\2") \3"/e;s/ - //'
this  7e1b6dbfa824d5d114e96981cededd00  a test

或大多数sed解决方案:

<<<"this is a test" sed -r 'h;s/^\S+\s(\S+).*/md5sum <<<"\1"/e;G;s/^(\S+).*\n(\S+)\s\S+\s(.*)/\2 \1 \3/'
this 7e1b6dbfa824d5d114e96981cededd00 a test

使用md5sum

替换is中的this is a test

说明:

在第一个中: - 识别列并在Bash命令中使用后引用作为参数进行替换和评估,然后进行修饰以丢失由md5sum命令生成的文件描述(在本例中为标准输入)。

在第二个: - 类似于第一个但是将输入字符串配置到保留空间中,然后在评估md5sum命令之后,将字符串G附加到模式空间(md5sum结果)并使用替换排列适合。

答案 3 :(得分:1)

虽然我没有进行任何基准测试,但read可能会比awk更好。

输入(scratch001.txt):

foo|bar|foobar|baz|bang|bazbang
baz|bang|bazbang|foo|bar|foobar

使用read进行转换:

while IFS="|" read -r one fish twofish red fishy bluefishy; do
  twofish=`echo -n $twofish | md5sum | tr -d "  -"`
  echo "$one|$fish|$twofish|$red|$fishy|$bluefishy"
done < scratch001.txt

产生输出:

foo|bar|3858f62230ac3c915f300c664312c63f|baz|bang|bazbang
baz|bang|19e737ea1f14d36fc0a85fbe0c3e76f9|foo|bar|foobar

答案 4 :(得分:1)

您也可以使用perl执行此操作:

echo "aze qsd wxc" | perl -MDigest::MD5 -ne 'print "$1 ".Digest::MD5::md5_hex($2)." $3" if /([^ ]+) ([^ ]+) ([^ ]+)/' 
aze 511e33b4b0fe4bf75aa3bbac63311e5a wxc

如果你想混淆大量的数据,它可能比sed和awk更快,它需要为每一行分叉md5sum进程。