HP-UX에서 쉘 스크립트 성능을 향상시키기 위해 루프를 한 줄 명령으로 변환

HP-UX에서 쉘 스크립트 성능을 향상시키기 위해 루프를 한 줄 명령으로 변환

내 쉘 스크립트에 다음 루프가 있습니다. 수행하는 작업은 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

3000바이트보다 작은 파일을 읽고 파일을 생성할 수 있는 명령이 Unix에 있습니까? 루프를 피해야합니다

답변1

while read line; do
    bytes=` echo $line | wc -c `
done

이것은 느린 부분일 수 있습니다. 각 입력 라인에 대해 외부 명령을 실행하고 있기 때문입니다.

ksh에서는 ${#line}간단히 다음을 사용하여 해당 변수의 문자열 길이를 얻을 수 있습니다. 그러나 다중 바이트 문자가 있는 경우 쉘은 각 전체에 대해 하나씩 계산할 수 있습니다.특징, wc -c각각 하나씩 계산 하면서바이트. 스크립트가 C 로케일을 사용하도록 추가되어 LC_ALL=C모든 개별 바이트가 계산됩니다.

그러나 셸은 가장 빠르거나 가장 좋은 도구가 아닐 수도 있습니다. 스크립트를 올바르게 읽었다면 3000자를 초과하는 줄을 삭제하고 싶습니다. 다음과 같이 할 수 있습니다 grep(표준 BRE여야 함).

grep -e '^.\{0,300\}$' "$file"

아니면 awk를 사용하세요:

awk 'length <= 3000' "$file"

마찬가지로, 바이트 수를 계산하려면 C 로케일을 사용하는 것이 도움이 될 것입니다 LC_ALL=C awk ....

관련 정보