我似乎无法理解为什么到目前为止我一直运行良好的脚本在稍大的输入文件上失败。
如果我在 820000x75(逐行)的文件上运行该脚本,该脚本运行得很好,但如果我在 140 万 x 75 的文件上运行该脚本,该脚本将无法打印任何内容,并显示唯一的错误消息被“杀死”。我的输入是否遇到了 awk 的大小限制?
这是脚本,它应该只读取浮点数文件并将它们以不同的方式打印在另一个文件中:
BEGIN{ i=1; j=1
getline
getline
}{
if($3 ~ /MO/ ){
i=1
if(0=="1"){print i,j}
j++
}
else {
# substr(string, start [, length ])
if(length($0)>"61"){
Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
Mat[i,j]=sprintf("%.8g",substr($0,31,15)); i++
Mat[i,j]=sprintf("%.8g",substr($0,46,15)); i++
Mat[i,j]=sprintf("%.8g",substr($0,61,15)); i++
}
else if(length($0)>"46"){
Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
Mat[i,j]=sprintf("%.8g",substr($0,31,15)); i++
Mat[i,j]=sprintf("%.8g",substr($0,46,15)); i++
}
else if(length($0)>"31"){
Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
Mat[i,j]=sprintf("%.8g",substr($0,31,15)); i++
}
else if(length($0)>"16"){
Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
}
else if(length($0)>"1"){
if($0!="0"){ Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++ }
else{print "scratch.scr.readMO: a zero element was found!"}
}
else if(length($0)=="0"){ print "scratch.scr.readMO: error-0"}
else{ print "scratch.scr.readMO: error-2"}
}
}
END{
if(0=="1"){print (i-1),j}
for (x=1; x<=(i-1); x++)
{ for (y=1; y<=j; y++)
{ printf "%.8g %s ", Mat[x,y], " " > "MOs_"label".txt"
}
if (x<(i-1)) {printf "\n " > "MOs_"label".txt" }
}
}
这是我用来运行它的命令:
gawk -v label=P -f script file_to_process
答案1
消息Killed
通常表明内核已终止您的进程,原因很可能是资源耗尽(内存不足)或配额耗尽(内存不足)允许的内存使用)。您可以通过仔细阅读系统日志来查看来自内核的消息(通常/var/log/messages
(或者,如果您在看到进程死亡时就在那里,请运行dmesg
),通常可以了解内核为何决定您的进程必须死亡。