我的 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 字节,然后创建文件。我需要避免循环
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 ...
。