2017-04-04 96 views
1

我编写了一个脚本,它需要一个csv文件,并用一些字符串(Key)替换第二列的HASH中的第三列。 经过256行后,我得到一个错误使用Awk和Fork时出现“资源暂时不可用”

awk:cmd。 3:(FILENAME = C:/hanatest/test.csv FNR = 257)fatal: 无法为`echo -n E5360712819A7EF1584E2FDA06287379FF5CC3E0A5M7J6PiQMaSBut52ZQhVlS4 | openssl ripemd160 |切-f2 -d”“”(叉:资源暂时不可用 )

我改变CSV文件,我后256行始终得到了同样的错误。

这里是我的代码:

awk -F "," -v env_var="$key" '{ 
    tmp="echo -n "$2env_var" | openssl ripemd160 | cut -f2 -d\" \"" 
tmp | getline cksum 
$3=toupper(cksum) 
print 
}' //test/source.csv > //ziel.csv 

你能帮帮我吗?

这里我的样本输入:

25,XXXXXXXXXXXXXXXXXX,? 
44,YYYYYYYYYYYYYYYYYY,? 
84,ZZZZZZZZZZZZZZZZZZ,? 

,在这里我的预期输出:

25,XXXXXXXXXXXXXXXXXX,301E2A8BF32A7046F65E48DF32CF933F6CAEC529 
44,YYYYYYYYYYYYYYYYYY,301E2A8BF32A7046F65E48EF32CF933F6CAEC529 
84,ZZZZZZZZZZZZZZZZZZ,301E2A8BF32A7046F65E48EF33CF933F6CAEC529 

在此先感谢

+0

您正在为每个输入行运行一个新进程,并且我怀疑没有终止它,所以您最多只能访问256个进程或管道或其他内容。 'ulimit -a'说什么? [编辑:其实,我很困惑你要在代码中做什么,但我仍然认为你达到了极限。] – gilez

+0

感谢您的回复,在这里输出ulimit -a: $ ulimit文件大小(块,-f)无限制 打开文件(-n)256 管道大小(512字节, - - )无限制 p)8 堆栈大小(千字节,-s)2032 cpu时间(秒,-t)无限制 最大用户进程(-u)256 虚拟内存(千字节,-v)无限制 – Houssem

+0

任何想法将代码更改为得到我的输出? – Houssem

回答

3

让我们把你的代码更健壮第一:

awk -F "," -v env_var="$key" '{ 
    tmp="echo -n \047" $2 env_var "\047 | openssl ripemd160 | cut -f2 -d\047 \047" 
    if ((tmp | getline cksum) > 0) { 
     $3 = toupper(cksum) 
    } 
    close(tmp) 
    print 
}' /test/source.csv > /ziel.csv 

现在 - 你还有问题吗?如果您正在考虑使用getline,请务必阅读并完全理解http://awk.freeshell.org/AllAboutGetline中讨论的正确用法和所有注意事项。

+0

谢谢埃德,它适用于示例数据,但是当我将它用于大型csv(1Go)时,我觉得它太慢了。我昨天运行脚本,现在我只得到30Mo。其实原始csv数据的大小是1Go,所以我认为它会在一个月后完成 – Houssem

+0

我没有说这是一个很好的方法,我只是回答了你如何避免这个错误的问题。请参阅http://stackoverflow.com/help/someone-answers下一步该做什么。如果您需要不同方法的帮助,请发布后续问题。 –

相关问题