Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python unix脚本的增强_Python_Shell_Unix_Awk_Sed - Fatal编程技术网

Python unix脚本的增强

Python unix脚本的增强,python,shell,unix,awk,sed,Python,Shell,Unix,Awk,Sed,我有一个算法,可以屏蔽用户输入的列的数据。下面的功能也是为同样的目的而设计的。当脚本被执行时,屏蔽100000条记录大约需要4个小时。客户希望在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 ns

我有一个算法,可以屏蔽用户输入的列的数据。下面的功能也是为同样的目的而设计的。当脚本被执行时,屏蔽100000条记录大约需要4个小时。客户希望在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\u 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
然后输出应该如下所示

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))
def数据掩码(col\u val):
mod=len(col_val)+和(map(ord,col_val))%10
result=“”
对于i,ch-in枚举(列值,mod+1):
absnum=abs(ord(ch)-i)
如果“A”@Daniel,
很好的代码,为同一个问题写了类似的东西,
但既然你的代码更好,我就不发了,
没有想到使用enumerate,正在循环使用它们


现在,我将回顾并重新思考我的许多代码,以包括枚举自由。

“不要搁置这个问题。或者否决。这是非常紧急的。”正如你所知,这是一个很好的否决方式。只是不要。你应该看看并阅读本网站的指导方针,而不是恳求。这不是您的个人编程/调试/优化服务。不要那样对待它。为了记录在案,我没有否决投票。所以,用Java重写代码,它的性能比bash好得多。你可以用锤子和肥皂得到柠檬汁,但我可能会用柠檬压榨机。如果你的客户需要一个能做unix和bash的人,他应该雇佣一个能做这件事的人。不知道印度的IT业务——但如果“服务提供商”接受任何合同,他们没有合格的ppl来从事IT工作,并且让任何人都能胜任这项工作——我很高兴我不在那个地方,也不在那个行业。我不会接受一份我不称职的工作,但我必须运气好,才能在我擅长的领域找到一份可靠的工作。希望你能得到帮助,祝你好运-但这不是一个合适的地方。我不确定这会有多大帮助,但由于你发布的代码没有适当的缩进,实际上是不可读的。很多人会看到大量的人物,甚至不知道这个问题是关于什么的,就直接进入下一个问题。是的,没关系。非常感谢你,丹尼尔,非常感谢你。感谢您通过离线提供的宝贵信息。这真的帮了我很大的忙。以上是评论,不是回答。@EdMorton,现在已经学会了如何评论。:)伟大的培训的下一阶段将学习如何删除答案:-)
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))