python - unix脚本的增强
问题描述
我有一个算法可以屏蔽用户输入的列的数据。下面的功能是为此设计的。执行脚本时,大约需要 4 小时才能屏蔽 10 万条记录。客户希望在 10 分钟内得到相同的结果。您能否建议我如何实施以下内容,以便提高其性能。无论如何在不改变算法的情况下改变功能。
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"
}
这里col_val=$1
由用户输入。如果用户输入 2,那么我们的代码将屏蔽第二列。我们通过下面调用上面的函数。
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
fi
line=$((line + 1))
done <$temp_outputfile
在这里,我们将文件分成 3 个部分。然后调用我们的函数。这skipline
是我们的代码应该跳过的行数。例如标题。所以如果输入是
id|name|dept
11|Shrut|consultant
12|wipro|HR
13|capgemini|IT
那么输出应该如下所示。
id|name|dept
11|sqmbr|consultant
12|itzaw|HR
13|khvlipkoi|IT
请提出一些方法。如果您需要一些澄清,我会在评论中提供,但请不要搁置。我必须在不更改 data_mask() 中编写的算法的情况下提高执行速度。函数可以更改,但算法不能更改。我期待你的帮助。
解决方案
Bash 在执行循环时性能不是很好。既然你标记了这个问题python
,python应该没问题吧?
def data_mask(col_val):
mod = len(col_val) + sum(map(ord, col_val)) % 10
result = ""
for i, ch in enumerate(col_val, mod + 1):
absnum = abs(ord(ch) - i)
if 'A' <= ch <= 'Z':
ch = chr(ord('A') + absnum % 26)
elif 'a' <= ch <= 'z':
ch = chr(ord('a') + absnum % 26)
elif '0' <= ch <= '9':
ch = chr(ord('0') + absnum % 10)
else:
ch = chr(ord('A') + absnum % 10)
result += ch
return result
while open(temp_outputfile) as lines:
while open(outputfile, 'w') as output:
output.write(next(lines))
for line in lines:
pre, col_val, post = line.split('|', 2)
output.write("{}|{}|{}".format(pre, data_mask(col_val), post))
推荐阅读
- overriding - Puppeteer:如何在无头 Chrome 中启用本地覆盖?
- python - 如何重置熊猫数据框的索引,在特定位置插入结果列?
- excel - Vba循环列并在子字符串之后更改值
- javascript - 在 c++ 和 node.js(服务器)之间建立套接字通信的困难
- json - 将数据从 SQLite 表导出到 Flutter 中的 json 文件
- c++ - 如何找到 d3dx9.h 错误的 DirectX 位置
- python - 如何使用python在powershell中创建链接?
- function - SwiftUI:点击切换时调用函数并且变量的状态发生变化
- javascript - 如何在 Firestore 中正确使用 arrayUnion?
- python - 为 Django 设置 cx_Oracle 和 Oracle 11g,名称与主机?在哪里放置即时客户端?