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

0 ksh hp-ux awk

我的 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
Run Code Online (Sandbox Code Playgroud)

Unix 中是否有任何命令读取文件,如果少于 3000 字节,然后创建文件。我需要避免循环

ilk*_*chu 5

while read line; do
    bytes=` echo $line | wc -c `
done
Run Code Online (Sandbox Code Playgroud)

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

在 ksh 中,您可以使用${#line}来获取该变量中字符串的长度。但请注意,如果您有多字节字符,shell 可能会为每个完整的字符wc -c计数一个,而为每个字节计数一个。添加LC_ALL=C让脚本使用 C 语言环境,这将导致计算所有单个字节。

但是,shell 可能不是用于此目的的最快或最佳工具。如果我正确阅读了您的脚本,您想删除超过 3000 个字符的行。你可以这样做grep(这应该是标准的 BRE):

grep -e '^.\{0,300\}$' "$file"
Run Code Online (Sandbox Code Playgroud)

或使用 awk:

awk 'length <= 3000' "$file"
Run Code Online (Sandbox Code Playgroud)

同样,使用C语言环境应该在这里帮助,如果你想要,而不是数字节:LC_ALL=C awk ...