将循环转换为单行命令以提高 HP-UX 中的 shell 脚本性能

将循环转换为单行命令以提高 HP-UX 中的 shell 脚本性能

我的 shell 脚本中有以下循环。它的作用是删除超过 3000 字节的记录,实际上它在读取和逐行检查字节时需要更长的时间,如果少于 3000 字节则创建一个文件。

if [ $FILE_NM = "HUN" ]
then
    HUN_FILENM=` ls HUN*.txt | tail -1 `
    while read line
    do
        bytes=` echo $line | wc -c `
        if (( $bytes <= 3000 )); then
            echo "$line" >> output290_donot_delete.txt
        fi
    done < $HUN_FILENM
    mv output290_donot_delete.txt $HUN_FILENM
fi

Unix 中是否有任何命令可以读取小于 3000 字节的文件然后创建文件。我需要避免循环

答案1

while read line; do
    bytes=` echo $line | wc -c `
done

这可能是缓慢的部分,您正在为每个输入行运行外部命令。

在 ksh 中,您只需使用即可${#line}获取该变量中字符串的长度。但请注意,如果您有多字节字符,shell 可能会为每个整体计数一个特点,同时wc -c每数一字节。添加LC_ALL=C以使脚本使用 C 语言环境,这将导致对所有单独的字节进行计数。

然而,shell 可能不是最快或最好的工具。如果我没看错你的脚本,你想删除超过 3000 个字符的行。你可以这样做grep(这应该是标准的 BRE):

grep -e '^.\{0,300\}$' "$file"

或使用 awk:

awk 'length <= 3000' "$file"

同样,如果您想计算字节数,则使用 C 语言环境应该会有所帮助:LC_ALL=C awk ...

相关内容