首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ksh脚本优化

ksh脚本优化
EN

Stack Overflow用户
提问于 2010-12-14 01:56:12
回答 1查看 917关注 0票数 1

我有一个小脚本,它简单地读取文件的每一行,检索id字段,运行实用程序来获取名称,并将名称附加到末尾。问题是输入文件很大(2 2GB)。由于输出与输入相同,但附加了10-30个字符名称,因此它具有相同的数量级。我如何优化它以读取大缓冲区,在缓冲区中处理,然后将缓冲区写入文件,从而最大限度地减少文件访问次数?

代码语言:javascript
复制
#!/bin/ksh
while read line
do
    id=`echo ${line}|cut -d',' -f 3`

    NAME=$(id2name ${id} | cut -d':' -f 4)

    if [[ $? -ne 0 ]]; then
        NAME="ERROR"
        echo "Error getting name from id2name for id: ${id}"
    fi

    echo "${line},\"${NAME}\"" >> ${MYFILE}
done < ${MYFILE}.csv

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-14 02:57:23

通过在循环的每次迭代中消除对cut的两次调用,可以大大提高速度。将输出文件的重定向移动到循环的末尾也可能会更快。由于您没有展示输入行的示例,或者id2name由什么组成(它可能是一个瓶颈)或者它的输出是什么样子,所以我只能提供这个近似值:

代码语言:javascript
复制
#!/bin/ksh
while IFS=, read -r field1 field2 id remainder   # use appropriate var names
do
    line=$field1,$field2,$id,$remainder
    # warning - reused variables
    IFS=: read -r field1 field2 field3 NAME remainder <<< $(id2name "$id")
    if [[ $? -ne 0 ]]; then
        NAME="ERROR"
        # if you want this message to go to stderr instead of being included in the output file include the >&2 as I've done here
        echo "Error getting name from id2name for id: ${id}" >&2  
    fi
    echo "${line},\"${NAME}\""
done < "${MYFILE}.csv" > "${MYFILE}"

操作系统会为你做缓冲。

编辑:

如果您的ksh版本没有<<<,请尝试如下所示:

代码语言:javascript
复制
    id2name "$id" | IFS=: read -r field1 field2 field3 NAME remainder

(如果您使用的是Bash,这将不起作用。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4431863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档