특정 수의 줄을 새 파일로 출력하여 원본 파일이 "비워질" 때까지 새 번호가 지정된 파일을 만듭니다.

특정 수의 줄을 새 파일로 출력하여 원본 파일이 "비워질" 때까지 새 번호가 지정된 파일을 만듭니다.

다음과 같은 염색체 파일이 있습니다.

JH739887 1 30495534
JH739888 1 29527584
JH739889 1 22321128
JH739890 1 19792264
JH739891 1 19033121
JH739892 1 17022292
[...]

테스트 파일은 다음과 같이 생성될 수 있습니다.

cd ~/Desktop/
printf "JH%06d \t 1 \t 100 \n" {1..27239} > test_lotsoflines.txt

27239개의 라인이 있지만 약 2724개의 라인을 포함하는 10개의 파일을 갖고 싶습니다(이렇게 하면 병렬 명령이 작동하게 됩니다).

원본 파일의 1~2724행을 새 파일로 출력할 수 있었습니다.

sed -n -e '1,2724p' ${REFGENO}/geoFor1.chrom.start.stop.sizes > ~/Desktop/output.txt
wc -l ~/Desktop/output.txt
 2724 ~/Desktop/output.txt

하지만 이제 파일 끝(27239행)에 도달할 때까지 2725행에서 5448행으로 증가하고 새 파일로 출력하고 싶습니다 output##.txt.

output01.txt 2724 lines 
output02.txt 2724 lines 
[...]
output10.txt 2723 lines

나는 다음을 사용하여 printf "output%02d.txt\n"##.txt 출력을 얻을 생각입니다.

하지만 파일 수를 늘리는 방법은 무엇입니까?그리고10개의 파일을 생성하려면 파일에 몇 줄이 생성됩니까? 물론 원본 파일의 줄 수가 "0"으로 끝나지 않으므로 마지막 파일에는 2723줄이 있습니다.

사용할 수 있는 한 가지 접근 방식은 다음에서 제공된 솔루션을 사용하여 파일 이름을 업데이트하는 것입니다.Bash에서 문자열 끝의 숫자를 증가시키는 방법은 무엇입니까?:

updateVersion()
{
  [[ $1 =~ ([^0-9]*)([0-9]+) ]] || { echo 'invalid input'; exit; }     
  echo "${BASH_REMATCH[1]}$(( ${BASH_REMATCH[2]} + 1 ))"
}

그런데 파일명과 확장자를 분리해야 하는데...

저는 Mac을 사용하고 있습니다: macOS Mojave 10.14.6.

답변1

이런 종류의 일이 바로 GNU Coreutils split기능이 수행하도록 설계된 것입니다.

전임자. 접두사 , 접미사 및 증분 숫자를 file사용하여 줄을 분할하지 않고 10개의 청크로 분할output.txt

split -d -n l/10 --additional-suffix='.txt' file output

관련 정보