大量行中查找、散列值和替换的并发性

Lia*_*eri 4 sed hashsum concurrency

我有一堆文件,每一行都有一个我试图用散列模糊的唯一值。

然而,文件中有 300 万行,粗略计算完成该过程所需的时间非常长,为 32 天。

for y in files*; do 
  cat $y | while read z; do
    KEY=$(echo $z | awk '{ print $1 }' | tr -d '"')
    HASH=$(echo $KEY | sha1sum | awk '{ print $1 }')
    sed -i -e "s/$KEY/$HASH/g" $y
  done
done
Run Code Online (Sandbox Code Playgroud)

为了提高这个过程的速度,我假设我将不得不引入一些并发性。

基于https://unix.stackexchange.com/a/216475 的仓促尝试导致我

N=4
(
for y in gta*; do 
  cat $y | while read z; do
    (i=i%N)); ((i++==0)); wait
    ((GTA=$(echo $z | awk '{ print $1 }' | tr -d '"')
    HASH=$(echo $GTA | sha1sum | awk '{ print $1 }')
    sed -i -e "s/$KEY/$HASH/g) & 
  done
done
)
Run Code Online (Sandbox Code Playgroud)

哪个表现更好。

示例输入

"2000000000" : ["200000", "2000000000"]
"2000000001" : ["200000", "2000000001"]
Run Code Online (Sandbox Code Playgroud)

示例输出

"e8bb6adbb44a2f4c795da6986c8f008d05938fac" : ["200000", "e8bb6adbb44a2f4c795da6986c8f008d05938fac"]
"aaac41fe0491d5855591b849453a58c206d424df" : ["200000", "aaac41fe0491d5855591b849453a58c206d424df"]
Run Code Online (Sandbox Code Playgroud)

也许我应该同时阅读这些行,然后在每一行上执行哈希替换?

Ed *_*ton 5

FWIW 我认为这是您可以在 shell 脚本中执行此操作的最快方法:

$ cat tst.sh
#!/usr/bin/env bash

for file in "$@"; do
    while IFS='"' read -ra a; do
        sha=$(printf '%s' "${a[1]}" | sha1sum)
        sha="${sha% *}"
        printf '%s"%s"%s"%s"%s"%s"%s"\n' "${a[0]}" "$sha" "${a[2]}" "${a[3]}" "${a[4]}" "$sha" "${a[6]}"
    done < "$file"
done
Run Code Online (Sandbox Code Playgroud)

$ ./tst.sh file
Run Code Online (Sandbox Code Playgroud)

$ cat file
"e8bb6adbb44a2f4c795da6986c8f008d05938fac" : ["200000", "e8bb6adbb44a2f4c795da6986c8f008d05938fac"]"
"aaac41fe0491d5855591b849453a58c206d424df" : ["200000", "aaac41fe0491d5855591b849453a58c206d424df"]"
Run Code Online (Sandbox Code Playgroud)

但是正如我在评论中提到的那样,您最好使用内置 sha1sum 功能的工具(例如 python)来提高执行速度。