열 9와 10에서 "20" 값을 발견할 때마다 파일을 더 작은 파일로 분할하는 방법

열 9와 10에서 "20" 값을 발견할 때마다 파일을 더 작은 파일로 분할하는 방법

예: 이것은 소스 파일입니다. 20은 9열과 10열의 "1"행과 "9"행에 나타납니다. 따라서 이를 파일 1과 파일 2의 2개 청크 파일로 분할해야 합니다(열 9와 10에서 값 20을 두 번 발견했기 때문입니다).

0012345020DTL0
00000000510000
00000000520000   
00000000530000                                                                                                                                                                                                 
12342000510000
00000000520000  
00000000532000
00000000800000
0000000020DTL0                                                                                                                                                                                           
00000000510730
00000000520000
1234500053 000                                                                                                                                                                                                   
00000000510000
00000000520000 
00000000530000
00000000800000

20이제 위 파일을 9열과 10열에 있는 값을 기준으로 청크 파일로 분할 해야 합니다 . 9열과 10열에 20이 나타날 때마다 파일은 단순히 청크 파일로 분할됩니다. 9열과 10열이 아닌 다른 곳에 20이 나타나면 분할할 필요가 없습니다.

출력: 파일 1:

0012345020DTL0
00000000510000
00000000520000   
00000000530000                                                                                                                                                                                                 
12342000510000
00000000520000  
00000000532000
00000000800000

파일 2:

1298600020DTL0                                                                                                                                                                                           
00000000510730
00000000520000
1234500053 000                                                                                                                                                                                                   
00000000510000
00000000520000 
00000000530000
00000000800000   

답변1

csplit패턴 기반 파일 분할을 사용할 수 있습니다 .

csplit <file> <split pattern> <repetiotions>

즉:

csplit -z datafile '/^........20/' '{*}'

설명하다:

  • -z: 빈 파일을 만들지 마세요. (첫 번째 줄의 패턴으로 시작하면 패턴이 일치할 때까지 "0번째" 줄부터 파일이 남습니다.

  • '/^........20/': 분할 패턴과 일치합니다. 여기서 ^=줄 시작, .=모든 문자(8회)

  • {*}: 최대한 많이 반복하세요

답변2

당신은 그것을 사용할 수 있습니다 awk:

awk 'BEGIN{filename=0};$0 ~ /^........20....$/{filename++};{print >> "file"filename}' input_file

제공된 입력을 기반으로 다음이 생성됩니다.

file1:

0000000020DTL0
00000000510000
00000000520000   
00000000530000
00000000510000
00000000520000  
00000000530000
00000000800000

file2:

0000000020DTL0
00000000510730
00000000520000
0000000053 000
00000000510000
00000000520000 
00000000530000
00000000800000

관련 정보