【发布时间】:2013-08-21 22:40:59
【问题描述】:
我想知道是否可以使用 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 运行脚本时所看到的,包含第二列的值不是散列值。前几行虽然是散列。不确定发生了什么,但它应该可以工作。
【问题讨论】:
-
“极慢”有多慢?
-
@Vaughn 好吧,我有多个文件需要处理,一个文件是 255MB。那个文件在我的机器上可能需要 3-4 个小时。我希望最终只需要 15 到 20 分钟即可完成该大小的文件。