루프를 사용하여 파일을 여러 레코드로 분할하고 파일에 새 이름을 지정합니다.

루프를 사용하여 파일을 여러 레코드로 분할하고 파일에 새 이름을 지정합니다.

나는 큰 파일(800,000개의 레코드)을 가지고 있고 이를 각각 20,000개의 레코드를 포함하는 다른 파일로 분할하고 싶습니다. 이렇게 할 수 있지만 다음 질문은 새 파일을 자동으로 생성할 수 있는지 알고 싶습니다.

예: file1에는 800,000개의 레코드가 포함되어 있습니다. 먼저 20000개의 레코드를 가져와 다른 파일로 옮긴 다음 문자를 삭제했습니다 \r.

sed -n '1,20000p;20001q'  file1 > file1_1
sed -e 's/\r//g' file1_1 > file1

루프에서 뭔가를 할 수 있나요? 아니면 40번을 써야 하나요?

레코드 수는 가변적입니다. 현재는 800,000개의 레코드를 포함하지만 내일은 812,321개의 레코드 중 789.123개의 레코드를 포함할 수 있습니다. "끝 번호"를 제공하려면 sed 명령을 사용해야 합니까?

답변해 주셔서 감사합니다. !

답변1

명령을 사용하여 파일 분할을 시도할 수 있습니다 split. 파일에 20,000개의 레코드를 포함하려는 경우 명령은 다음과 같습니다.

split -l 20000 file1

결과 파일에 특정 접두사를 원하는 경우 다음과 같은 명령을 사용하십시오.

split -l 20000 file1 PREFIX

결과 파일의 숫자 접미사를 원하면 다음과 같은 명령을 사용하십시오.

split -d -l 20000 file1 PREFIX

이 명령은 각각 20,000줄로 나누어진 여러 파일을 생성합니다.

삭제하려면 ^M루프를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

for i in PREFIX??
do
    dos2unix "$i" "${i}_unix"
done

_unix삭제된 파일 끝에 추가됩니다.^M

답변2

Romeo Ninov가 당신에게 준 것입니다.정답™: 분할을 사용합니다. 그러나 일반적인 경우에 답하려면 다음 sed과 같이 동일한 작업을 수행할 수 있습니다.

i=1;
filelen=$(wc -l < file1)
while [[ $i -le $filelen ]]; do 
    sed -n "s/\r//;$i,$((i+19999))p;$(($i+20000))q;" file1 > file1.$i;
    ((i+=20000)); 
done

이렇게 하면 20,000줄의 각 그룹이 새 파일에 저장됩니다. 질문에 표시된 대로 수행하고 처음 20000개 행만 유지하려면 훨씬 간단합니다.

sed -i 's/\r//; 200001q' file

관련 정보