![대용량 파일을 특정 줄 수로 분할](https://linux55.com/image/17668/%EB%8C%80%EC%9A%A9%EB%9F%89%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%8A%B9%EC%A0%95%20%EC%A4%84%20%EC%88%98%EB%A1%9C%20%EB%B6%84%ED%95%A0.png)
행 길이가 40,000개인 CSV가 있습니다. x행에서 y행까지 읽는 가장 간단한 도구는 무엇입니까?
이 작업을 수행하는 더 전문적인 방법이 있다고 확신하지만 다음 형식으로 작동하는 bash 스크립트를 원합니다.
readFile --from 10 --to 20
이렇게 하면 10개의 행을 처리한 다음 다시 호출하여 10개의 행을 더 가져올 수 있습니다. AWK 스크립트만 사용하려고 하는데 , cat
, grep
또는 tail
이와 유사한 것을 사용하여 더 간단하게 수행할 수 있습니까 head
?
답변1
#!/bin/sh
while getopts "f:t:" option; do
case "$option" in
f) from=$OPTARG ;;
t) to=$OPTARG ;;
esac
done
if [ -z "$from" ] || [ -z "$to" ]; then
echo "must give both -f and -t" >&2
exit 1
fi
awk -v "from=$from" -v "to=$to" 'from <= NR && NR <= to' filename
# or:
sed -n "$from,$to p; $to q" filename
# or:
i=0
while read line; do
i=$(( i + 1 ))
if [ $i -ge $from ] && [ $i -le $to ]; then
printf "%s\n" "$line"
fi
[ $i -eq $to ] && break
done < filename
답변2
파일의 10~20행을 추출하는 것은 head
다음과 의 간단한 조합 입니다 tail
.
tail -n +11 | head -n 10 | mycommand
이 명령은 10줄을 건너뛰고 다음 10줄을 처리합니다. 파일의 모든 행을 순차적으로 처리하되 10개씩 그룹으로 처리하려는 경우 더 좋은 방법이 있습니다. 10줄을 반복해서 읽을 수 있습니다 head
. chunk=$(…; echo a)
후행 제거는 명령 a
대체에서 마지막 개행 문자를 억제하는 문제를 해결하는 데 사용됩니다. 이 접근 방식의 장점은 입력이 파이프된 경우에도 작동하고(되감을 수 없음) 일반 파일의 경우에도 더 빠르다는 것입니다. 경고, 테스트되지 않은 코드가 브라우저에 직접 입력되었습니다.
while chunk=$(head -n 10; echo a); chunk=${chunk#a}; [ -n "$chunk" ]; do
printf %s "$chunk" | mycommand
done <filename
또는 awk가 작업을 수행하도록 할 수 있습니다. 다시 말하지만, 테스트되지 않았습니다.
awk '
{chunk = chunk $0 RS}
NR % 10 {print chunk | "mycommand"; close("mycommand"); chunk="" }
END {if (chunk != "") {print chunk | "mycommand"; close("mycommand"); chunk="" }}
' <filename