我想知道是否可以使用 AWK 打印文件中的所有行,然后选择文件中的这些列之一以使用以下命令散列该值:
openssl dgst -sha1 | sed 's/^.* //'
我目前正在使用读取命令,但它似乎写得非常慢。这是我目前所拥有的:
while IFS="," read -ra line;
do
if [ "${line[1]}" != "" ]; then
echo -n "${line[*]}, Hash Value:"; echo "${line[1]}" | openssl dgst -sha1 | sed 's/^.* //'
else
if [ "${line[1]}" == "" ]; then
echo "${line[*]}, Hash Value: None";
fi
fi
done
所以我想我最终要说的是,我怎样才能使用 AWK 来打印所有行并在特定列上执行命令?希望加快阅读过程。另外,是否可以使用 AWK 打印目录中所有文件的列?
多谢你们!
更新
下面是包含将所有文本文件转换为 DOS 到 UNIX 格式的代码。下面是 unix.txt 的一些输出。最后,下面是我的脚本。
dos2unix
$ dos2unix *.txt
dos2unix: converting file unix.txt to Unix format ...
dos2unix: converting file woohoo.txt to Unix format ...
unix.txt 输入
7051,95230163,-1,53200703
7051,95230163,-1,53200703
7051,95230163,-1,53200703
53200703,2286,Mon Jul 01 13:30:03 PDT 2013
53200703,2286,Mon Jul 01 13:30:03 PDT 2013
53200703,2286,Mon Jul 01 13:30:03 PDT 2013
unix.txt 输出
$ ./trial.sh < unix.txt
7051,95230163,-1,53200703, Hash Value: c9b674deec9973f4d0feb83433d6db0b4ea5012a
7051,95230163,-1,53200703, Hash Value:
7051,95230163,-1,53200703, Hash Value:
53200703,2286,Mon Jul 01 13:30:03 PDT 2013, Hash Value: 2a8db89cc6f4ccdc0ce423011e869cb8b29b1003
53200703,2286,Mon Jul 01 13:30:03 PDT 2013, Hash Value:
53200703,2286,Mon Jul 01 13:30:03 PDT 2013, Hash Value:
脚本
gawk -F',' '
function hash(val, var)
{
if (val == "") {
var = "None"
}
else {
"echo \"" val "\" | openssl dgst -sha1" | getline var
sub(/.* /,"",var)
}
return var
}
{ printf "%s, Hash Value: %s\n", $0, hash($2) } '
正如您所看到的,当针对 unix.txt 运行脚本时,包含第二列的值没有散列。前几行虽然是散列。不知道发生了什么,但它应该工作。