Shell 将bash函数更改为awk

Shell 将bash函数更改为awk,shell,unix,awk,Shell,Unix,Awk,我的团队设计了以下功能。它在Bash中。我必须为包含数十万条记录的文件调用此函数。这花了太多时间。你们谁能建议我把下面的函数改成awk吗 data_mask() { col_val=$1 l_ret_str="" l_an=0 l_lp=0 l_mod=0 absnum=0 austart=65 auend=90 aclsize=26 alstart=97 alend=122 nstart=48 nend=57 nclsize=10

我的团队设计了以下功能。它在Bash中。我必须为包含数十万条记录的文件调用此函数。这花了太多时间。你们谁能建议我把下面的函数改成awk吗

 data_mask() {

  col_val=$1
  l_ret_str=""
  l_an=0
  l_lp=0
  l_mod=0
  absnum=0
  austart=65
  auend=90
  aclsize=26
  alstart=97
  alend=122
  nstart=48
  nend=57
  nclsize=10

  l_lp=`expr length "$col_val"`
  if [[ $l_lp -ne 0 ]]; then
    for i in `eval "echo {1..$l_lp}"`
    do
      single_char=$(SUBSTR "$col_val" $i)
      ascii_num_val=$(ASCII "$single_char")
      l_mod=$((l_mod+ascii_num_val))
    done

    l_mod=$((l_mod % nclsize))

    for i in `eval "echo {1..$l_lp}"`
    do
      single_char=$(SUBSTR "$col_val" $i)
      ascii_num_val=$(ASCII "$single_char")
      l_an=$ascii_num_val
      tempvar=$((l_an - l_lp - l_mod - i))
      absnum=$(ABS $tempvar)
      if [[ $l_an -ge $austart && $l_an -le $auend ]]; then
        tempmodval=$((absnum % aclsize))
        tempasciival=$((austart + tempmodval))
        l_ret_str=$l_ret_str$(CHR $tempasciival)
      elif [[ $l_an -ge $alstart && $l_an -le $alend ]]; then
        tempmodval=$((absnum % aclsize))
        tempasciival=$((alstart + tempmodval))
        l_ret_str=$l_ret_str$(CHR $tempasciival)
      elif [[ $l_an -ge $nstart && $l_an -le $nend ]]; then
        tempmodval=$((absnum % nclsize))
        tempasciival=$((nstart + tempmodval))
        l_ret_str=$l_ret_str$(CHR $tempasciival)
      else
        tempmodval=$((absnum % nclsize))
        tempasciival=$((austart + tempmodval))
        l_ret_str=$l_ret_str$(CHR $tempasciival)
      fi

    done
  fi
  echo "$l_ret_str"
}
我使用下面的登录名调用此函数。我必须为特定的专栏打电话。该列由用户输入。所以我把绳子分成三部分

  while read p; do

  if [[ $line -le $skip_line ]]; then
    echo "$p" >> $outputfile
  else
    pre_str=`echo $p | cut -d'|' -f1-$((colnum - 1))`
    column_value=`echo $p | cut -d'|' -f$colnum`
    post_str=`echo $p | cut -d'|' -f$((colnum + 1))-$totalcol`
    echo "column_value=$column_value"
    maskvalue=$(data_mask "$column_value")
    #echo $pre_str"|"$maskvalue"|"$post_str >> $outputfile
#    awk -v col=2 'BEGIN { FS=OFS="|" } col<=NF { $col = data_mask(" $col ") } 1' $temp_outputfile >>123.txt
     awk -v col=3 'BEGIN { FS=OFS="|" } col<=NF { $col = $maskvalue; print }' $temp_outputfile >123.txt
#     awk -F"|" -vOFS="|" 'NR==1{$3=100} {print}' file
  fi

  line=$((line + 1))

  done < $file
读取p时
;做
如果[$line-le$skip_line]];然后
回显“$p”>>$outputfile
其他的
pre|str=`echo$p | cut-d'|'-f1-$((colnum-1))`
列_值=`echo$p | cut-d'|'-f$colnum`
post|str=`echo$p | cut-d'|'-f$((colnum+1))-$totalcol`
echo“column_value=$column_value”
maskvalue=$(数据掩码“$列值”)
#echo$pre_str“|”$maskvalue“|”$post_str>>>$outputfile
#awk-v col=2'开始{FS=OFS=“|”}col试试这个:

awk -v col=3 'col<=NF { $col = "FUNCTION(" $col ")" } 1' file

awk-v col=3'col您能提供示例输入和预期输出吗?我们可以帮助您创建一个新的或编辑这个。真的吗?同样,没有样本输入和预期输出?我们回到函数是awk函数还是外壳函数?为什么不简单地为函数提供一个定义,这样我们就可以知道您要做什么了@Shurtisharma请与Onkar讨论,并阅读您之前收到的关于您的问题的反馈,以便你们能够从这个社区获得最有效的帮助。@Shurtisharma。。。。现在帮帮我。我看到你用了@EdMorton 5岁时的答案中的脚本:是的。。我用过,因为我的问题类型相似。但业绩并未得到改善。屏蔽10万条数据需要4小时。现在我更新了问题。你能给我一个同样的建议吗?非常感谢@andriymakukaha当函数接收参数中的参数时,这是有效的。否则,它将给出无法识别的错误函数。哪个函数?我的函数名是data_mask()。我正在使用下面的命令。它不起作用。awk-v col=2'BEGIN{FS=OFS=“|”}col而且我的函数接收该列的值。。。。在awk中,我想我们正在传递列号。你能帮我做同样的事吗。
awk -v col=3 'BEGIN { FS=OFS="|" } col<=NF { $col = "FUNCTION(" $col ")" } 1' file