다음 형식의 출력이 필요합니다.
예를 들어 입력 파일에서 1부터 50까지의 숫자 시퀀스를 생각해 보세요. 각 숫자는 데이터 행을 나타냅니다.
$ cat input.txt
1
2
3
.
.
.
49
50
나는 그것들이 각각 10줄로 구성된 5개의 파일에 있기를 원합니다.
$ cat output1.txt
1
2
.
.
.
9
10
$ cat output2.txt
11
12
.
.
.
19
20
등. 명령을 사용하지 않고 Bash 스크립트를 통해 이 작업을 수행하고 싶습니다 split
.
답변1
떨어져 awk
있는:
awk -va=1 '{ print > a; if(NR % 10 ==0){a++} }' input
1
그러면 , 2
및 파일이 생성 3
됩니다 4
. 5 5
로 인쇄하려면 output1
다음을 대신 사용하십시오.
awk -va=1 '{ print > "output"a; if(NR % 10 ==0){a++} }' input
설명하다
-va=1
: 변수를a
로 설정합니다1
.print > "output"a;
: 현재 행을 파일 이름output
과 변수의 현재 값 으로 인쇄합니다a
.if(NR % 10 ==0){a++}
:NR
현재 줄 번호입니다. 따라서NR
가 배수인 경우10
(NR
모듈로 10이 0인 경우)a
변수 값에 1을 추가합니다. 이렇게 하면 출력 파일의 번호 지정이 필요에 따라 변경됩니다.
답변2
분명히 당신은 split
(https://stackoverflow.com/questions/2016894/how-to-split-a-large-text-file-into-smaller-files-with-equal-number-of-lines) 그러나 루프를 대신 사용하려면 다음을 수행하십시오.
numLines=$(cat input.txt | wc -l)
size=50
n=$(( numLines / size ))
for (( i=0; i<n; i++ )); do
j=$(( i*size + 1 ))
tail -n +$j input.txt | head -n $size > output_$i.txt
done
한 줄 형식:
numLines=$(cat input.txt | wc -l); for (( i=0; i<$(( numLines / 50 )); i++ )); \
do tail -n +$(( i*50 + 1)) input.txt | head -n 50 > output_$i.txt; done