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