대용량 파일을 특정 줄 수로 분할

대용량 파일을 특정 줄 수로 분할

행 길이가 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

관련 정보