HP-UXでシェルスクリプトのパフォーマンスを向上させるために、ループを1行のコマンドに変換する

HP-UXでシェルスクリプトのパフォーマンスを向上させるために、ループを1行のコマンドに変換する

私のシェルスクリプトには次のループがあります。実行する作業は、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 ...

関連情報