如何在awk或sed中用哈希值(如MD5)替换列?
原始文件非常庞大,所以我需要这个非常有效。
答案 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进程。