속도

속도

sourcefile.txt10000줄(매일 증가)이 포함된 파일을 30개의 동일한 파일로 분할 하고 싶습니다 . 호출된 디렉토리가 있고 prog1분할 prog30된 파일을 동일한 파일 이름으로 이 디렉토리에 저장하고 싶습니다. 예 /prog1/myfile.txt/prog2/myfile.txt 들어 /prog30/myfile.txt.

divide.sh이것은 디렉토리에서 실행 이라는 bash 스크립트입니다.prog

#!/bin/bash
programpath=/home/mywebsite/project/a1/
array=/prog1/
totalline=$(wc -l < ./sourcefile.txt)   
divide="$(( $totalline / 30 ))"   
split --lines=$divide $./prog1/myfile.txt    
exit 1
fi

답변1

#!/bin/bash

# assuming the file is in the same folder as the script
INPUT=large_file.txt
# assuming the folder called "output" is in the same folder
# as the script and there are folders that have the patter
# prog01 prog02 ... prog30
# create that with mkdir output/prog{01..30} 
OUTPUT_FOLDER=output

OUTPUT_FILE_FORMAT=myfile

# split 
# -n -> 30 files
# $OUTPUT_FILE_FORMAT -> should start with this pattern
# --numeric-suffixes=1 -> end of file name should start from 01 
split -n 30 $INPUT $OUTPUT_FILE_FORMAT --numeric-suffixes=1

# move all files to their repective directories
for i in {01..30} 
do
    mv $OUTPUT_FILE_FORMAT$i $OUTPUT_FOLDER/prog$i/myfile.txt
done

echo "done :)"

exit

이 작업에는 분할 명령으로 충분합니다. 그러나 여기의 솔루션에서는 폴더 이름을 prog01다음 으로 시작하도록 요구합니다.prog1

답변2

유일한 awk해결책(질소여기서는 30개의 파일과 같습니다):

awk 'BEGIN{ cmd="wc -l <sourcefile.txt"; cmd|getline l; l=int((l+29)/30); close(cmd) } 
    NR%l==1{trgt=sprintf("prog%d",((++c)))}{print >trgt"/myfile.txt"}' sourcefile.txt

또는 쉘을 실행하고 행 수를 반환하십시오.소스파일.txtawk제안한대로 전달되었습니다.제틸.

awk 'NR%l==1{trgt=sprintf("prog%d",((++c)))}{print >trgt"/myfile.txt"}' 
    l=$(( ($(wc -l <sourcefile.txt)+29)/30 )) sourcefile.txt

답변3

split+bash해결책:

lines=$(echo "t=$(wc -l ./sourcefile.txt | cut -d' ' -f1); d=30; if(t%d) t/d+1 else t/d" | bc)
split -l $lines ./sourcefile.txt "myfile.txt" --numeric-suffixes=1

for f in myfile.txt[0-9]*; do 
    dir_n="prog"$(printf "%d" "${f#*txt}")  # constructing directory name
    mv "$f" "$dir_n/myfile.txt"
done

당신이 가지고 있다고 가정prog1~prog30이라는 폴더가 있습니다.(당신이 언급했듯이)

  • lines- 각 출력 파일에 대한 정수 행 수를 포함합니다.

    • t- 파일의 총 라인 수./sourcefile.txt
    • d=30구분 기호입니다
  • --numeric-suffixes=1-나뉘다다음으로 시작하는 숫자 접미사를 사용하도록 지시하는 옵션1

답변4

속도

  1. 파일의 줄 수를 세고 30으로 나눕니다. lines = cat ${file} | wc -l

  2. 필요한 파일 수를 얻으십시오 (bash는 이것을 정수로 반올림합니다) numOfFiles = ${lines} / 30

  3. 분할을 사용하여 파일 분할 split -l ${lines} -d --additional-suffix=-filename.extension ${file}

예상되는 결과

x01-파일 이름.확장자, x02-파일 이름.확장자... xN-파일 이름.확장자

여러 파일을 한 번에 처리하려면 for 루프로 감싸세요.

#!/bin/bash    
for FILE in $(find ${pathToWorkingDir} -type f -name "filename.extension")
do
    split -l ${lines} -d --additional-suffix=-filename.extension ${file}
    if [ $? -eq 0 ]; then
        echo "${file} splitted file correctly"
    else
        echo "there was a problem splitting ${file}"
        exit 1 #we exit with an error code
    fi
done
exit 0 #if all processed fine we exit with a success code

관련 정보