Bash 중첩 루프 [닫기]

Bash 중첩 루프 [닫기]

다음 형식의 출력이 필요합니다.

예를 들어 입력 파일에서 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

관련 정보