Optimization ksh脚本优化

Optimization ksh脚本优化,optimization,file-io,ksh,Optimization,File Io,Ksh,我有一个小脚本,它只读取文件的每一行,检索id字段,运行实用程序获取名称,并在末尾追加名称。问题是输入文件太大(2GB)。由于输出与输入相同,并附加了10-30个字符的名称,因此其数量级相同。如何优化它以读取大缓冲区,在缓冲区中处理,然后将缓冲区写入文件,从而使文件访问的数量最小化 #!/bin/ksh while read line do id=`echo ${line}|cut -d',' -f 3` NAME=$(id2name ${id} | cut -d':' -f

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

#!/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
#/bin/ksh
读行时
做
id=`echo${line}|cut-d','-f3`
NAME=$(id2name${id}| cut-d':'-f4)
如果[$?-ne 0]];然后
NAME=“错误”
echo“从id:${id}的id2name获取名称时出错”
fi
回显“${line},\“${NAME}\”“>>${MYFILE}”
完成<${MYFILE}.csv

谢谢

通过在循环的每个迭代中消除对
cut
的两个调用,您可以大大加快速度。将输出文件的重定向移动到循环的末尾可能会更快。由于您没有显示输入行的示例,也没有显示由
id2name
组成的内容(可能是瓶颈)或其输出外观,因此我只能提供以下近似值:

#!/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}"

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

通过在循环的每个迭代中消除对
cut
的两个调用,可以大大加快速度。将输出文件的重定向移动到循环的末尾可能会更快。由于您没有显示输入行的示例,也没有显示由
id2name
组成的内容(可能是瓶颈)或其输出外观,因此我只能提供以下近似值:

#!/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}"

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

谢谢Dennis。id2name根据id获取用户名,我无法控制该实用程序。但是,我想要有ID和相应的名称,并在点击db之前进行本地查找。我试过typeset-A,但是在ksh下它不被识别。不幸的是,在SunOS上,ksh93不可用。有没有其他解决办法?ThanksHmm,获取以下行的语法错误:IFS=:read-r field1 field2 field3 NAME余数谢谢,可以了。此外,由于删除了cut并使用了OS缓冲,现在速度要快得多!谢谢你,丹尼斯。id2name根据id获取用户名,我无法控制该实用程序。但是,我想要有ID和相应的名称,并在点击db之前进行本地查找。我试过typeset-A,但是在ksh下它不被识别。不幸的是,在SunOS上,ksh93不可用。有没有其他解决办法?ThanksHmm,获取以下行的语法错误:IFS=:read-r field1 field2 field3 NAME余数谢谢,可以了。此外,由于删除了cut并使用了OS缓冲,现在速度要快得多!