我试图同时在多个文件上运行awk sha2命令,但是它花费了很多时间。文件包含5lacs行,我将第一列转换为SHA2。这是我的代码
output="-SHA2.txt"
FILES="${filePath}/*"
for f in $FILES
do
echo $f
awk -F '\\[\\^' 'BEGIN {OFS = "[^"}
NR==1; NR>1{
tmp="echo -n "$1" | sha256sum | cut -f1 -d\" \""
tmp | getline cksum
$1=cksum;
print $0;
close(tmp)
}' $f > $f$output &
done
此代码花费太多时间超过2小时才能打印174个文件。每个都有50万行。
答案 0 :(得分:0)
而不是每个输入文件调用awk:
for f in *; do
awk '{print}' "$f" > "${f}.${sfx}"
done
尝试一次调用awk:
awk -v sfx="$sfx" 'FNR==1{close(out); out=FILENAME"."sfx} {print > out}' *
顺便说一下:
tmp="echo -n "$1" | sha256sum | cut -f1 -d\" \""
tmp | getline cksum
$1=cksum;
print $0;
close(tmp)
应该这样写,以提高鲁棒性:
cmd = "printf \047" $1 "\047 | sha256sum"
if ( (cmd | getline cksum) > 0 ) {
split(cksum,arr)
$1 = arr[1]
}
else {
print "Failed to get checksum" | "cat>&2"
}
close(cmd)
print
答案 1 :(得分:0)
我在将close
与getline
一起使用时遇到了很多问题。如果close
被删除,那么它很快。但是在这种情况下,getline
无法正常工作。