![将循环转换为单行命令以提高 HP-UX 中的 shell 脚本性能](https://linux22.com/image/176200/%E5%B0%86%E5%BE%AA%E7%8E%AF%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%8D%95%E8%A1%8C%E5%91%BD%E4%BB%A4%E4%BB%A5%E6%8F%90%E9%AB%98%20HP-UX%20%E4%B8%AD%E7%9A%84%20shell%20%E8%84%9A%E6%9C%AC%E6%80%A7%E8%83%BD.png)
我的 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 ...
。