我的 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 ...
。