私のシェルスクリプトには次のループがあります。実行する作業は、3000バイトを超えるレコードを削除することです。実際には、バイトを1行ずつ読み、確認し、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
3000バイト未満のファイルを読み取ってファイルを生成するコマンドはUnixにありますか?ループを避ける必要があります
答え1
while read line; do
bytes=` echo $line | wc -c `
done
これは遅い部分かもしれません。各入力ラインに対して外部コマンドを実行しているためです。
kshでは、${#line}
単に以下を使用して、その変数の文字列の長さを取得できます。ただし、マルチバイト文字がある場合、シェルは各文字ごとに1つずつ計算できます。特徴、wc -c
それぞれ一つずつ計算しながらバイト。スクリプトがCロケールを使用するように追加され、すべての個々のLC_ALL=C
バイトが計算されます。
しかし、シェルは最速でも最良のツールでもないかもしれません。スクリプトを正しく読んだら、3000文字を超える行を削除したいと思います。次のようにすることができますgrep
(標準BREでなければなりません)。
grep -e '^.\{0,300\}$' "$file"
またはawkを使用してください:
awk 'length <= 3000' "$file"
同様に、バイト数を計算するには、Cロケールを使用すると便利ですLC_ALL=C awk ...
。