Попробуйте:
awk -F"|" -v var="10" '
NR==1;
NR>1{
"echo "$2"|sha256sum" | getline shaoutput;
split(shaoutput, sha, " ");
print var, $2, $3, $4, $5, sha[1]
}' OFS="|" file
Вывод:
10|0001001010000026316|531849|1150|101|2e16abd9f3e3e368210b11faa5bfebdb6e001034b58cc9ad1c689dfd1f7eeacd
Я предпочитаю использовать NR==1
и NR>1
, так как он более читабелен.
NR==1;
в порядке, нет необходимости добавлять {print}
Для NR>1
я использую sha256sum
для генерации ша, поскольку awk не имеет никакой функции для этого (насколько мне известно).Я сохраняю вывод в переменной shaoutput
, очищаю вывод, используя split
, затем печатаю то, что нужно.
Я предпочитаю не хранить разделитель вывода внутри переменной var
.Использование запятых внутри печати заставит awk использовать переменную OFS
в качестве разделителя.
Отредактировано
Как предлагает Эд Мортон, улучшенное решение:
awk -v var="10" '
BEGIN{
FS=OFS="|"
}
NR==1;
NR>1{
shaoutput="";
cmd="echo \047" $2 "\047 | sha256sum" ;
if ( (cmd | getline line) > 0 ){
shaoutput=line
close(cmd)
}
split(shaoutput, sha, " ");
print var, $2, $3, $4, $5, sha[1];
}' file