所以,你并不是真的想用 来做这件事awk。任何流行的高级脚本语言——Perl、Python、Ruby 等——都会以更简单、更健壮的方式完成此任务。话虽如此,这样的事情会起作用。
给定这样的输入:
this is a test
Run Code Online (Sandbox Code Playgroud)
(例如,一行有四列),我们可以用它的 md5 校验和替换给定的列,如下所示:
awk '{
tmp="echo " $2 " | openssl md5 | cut -f2 -d\" \""
tmp | getline cksum
$2=cksum
print
}' < sample
Run Code Online (Sandbox Code Playgroud)
这依赖于 GNU awk(在 Linux 系统上默认情况下您可能会使用它),并且它用于openssl生成 md5 校验和。我们首先构建一个 shell 命令行,tmp将选定的列传递给md5命令。然后我们将输出通过管道传输到cksum变量中,并用校验和替换第 2 列。给定上面的示例输入,该 awk 脚本的输出将是:
this 7e1b6dbfa824d5d114e96981cededd00 a test
Run Code Online (Sandbox Code Playgroud)
我复制粘贴了 larsks 的回复,但我添加了关闭行,以避免出现本文中指出的问题: gawk / awk:管道日期到 getline *有时*不起作用
awk '{
tmp="echo " $2 " | openssl md5 | cut -f2 -d\" \""
tmp | getline cksum
close(tmp)
$2=cksum
print
}' < sample
Run Code Online (Sandbox Code Playgroud)