![HP-UX에서 쉘 스크립트 성능을 향상시키기 위해 루프를 한 줄 명령으로 변환](https://linux55.com/image/176200/HP-UX%EC%97%90%EC%84%9C%20%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%84%B1%EB%8A%A5%EC%9D%84%20%ED%96%A5%EC%83%81%EC%8B%9C%ED%82%A4%EA%B8%B0%20%EC%9C%84%ED%95%B4%20%EB%A3%A8%ED%94%84%EB%A5%BC%20%ED%95%9C%20%EC%A4%84%20%EB%AA%85%EB%A0%B9%EC%9C%BC%EB%A1%9C%20%EB%B3%80%ED%99%98.png)
내 쉘 스크립트에 다음 루프가 있습니다. 수행하는 작업은 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 ...
.