Команда Awk занимает слишком много времени для выполнения нескольких файлов при выполнении SHA2 - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь запустить команду awk sha2 для нескольких файлов одновременно, но это занимает так много времени.Файл содержит 5 строк строк, и я конвертирую первый столбец в 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 файла.У каждого есть 500 000 строк.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

У меня возникли проблемы с использованием close с getline, что занимает много времени.Если удалить close, то это очень быстро.Но getline неисправности в этом случае.

0 голосов
/ 20 декабря 2018

Вместо вызова 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
...