나는 큰 파일(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