텍스트 파일에서 데이터 추출

텍스트 파일에서 데이터 추출

다음 형식의 텍스트 파일이 있습니다.

$DATA1 소스='HSPICE' 버전='I-2013.12-SP2-1 32비트'  
.TITLE "CMOS 인버터 전송 특성"  
인덱스 t_r t_ft t_rf              
                 t_fr t_rr t_ff              
                 성격변화#            
1 1.361e-11 1.177e-11 8.807e-12        
                  9.063e-12 2.002e-08 2.002e-08        
                  2.500e+01 1                 
2 1.339e-11 1.178e-11 8.805e-12        
                  8.867e-12 2.002e-08 2.002e-08        
                  2.500e+01 1                 
3 1.334e-11 1.177e-11 8.811e-12        
                  8.824e-12 2.002e-08 2.002e-08        
                  2.500e+01 1   

.  
.  
.  
1000 1.339e-11 1.178e-11 8.805e-12        
                  8.867e-12 2.002e-08 2.002e-08        
                  2.500e+01 1   

처음 5개 행을 삭제하고 3개 행 세트에서 9개 값을 추출하고 싶습니다. 이 모든 값은 awk 명령을 사용하여 9개의 다른 출력 파일에 배치됩니다.
출력 파일의 예는 다음과 같습니다.-
File1.txt

1  
2  
.  
.  
1000  

파일 2.txt

1.361e-11   
1.339e-11   
1.334e-11  
.  
.  
.  
1.339e-11

3행 세트의 9개 요소 모두 동일합니다.

답변1

순수한 awk솔루션은 다음과 같습니다.

awk '
  NR<=5 { next }
  { for(i=1; i<=NF; i++) print $i > "File"++c}
  NF==2 { c=0 }
'

다섯 개의 헤더 줄을 건너뛰고 파일에 남아 있는 데이터가 있는 필드를 인쇄합니다. 해당 이름은 두 개의 필드만 있는 줄에서 재설정되는 카운터에 의해 정의됩니다.

답변2

bare 로도 가능 awk하지만 제가 가장 먼저 생각한 것은 sed+ awk조합이었습니다.

sed '1,5d;s/^\([[:digit:]]\)/\n\1/' file | 
awk 'BEGIN{RS="\n\n"}{for(i=1;i<=NF;i++){print $i > "file"i".txt"}}'

요점은 sed다음에서 시작하는 모든 줄에 새 줄을 추가(사용)하는 것 입니다.숫자를 선택한 다음 에서 레코드 구분 기호를 다시 정의합니다 awk.

답변3

또 다른 장점은 다음과 같습니다 sed.trprintf

tr -s '[:space:]' \\n <infile |
sed "/^[0-9]/,${$(
    printf '\nw file%b\nn' \
           1 2 3 4 5 6 7 8 '9\n}\c'
)"

클립보드에서 실행하고, 예제를 버퍼에 복사한 후 출력을 파이프 하고 xsel.../tmp

head -n3 /tmp/file?

...인쇄...

==> /tmp/file1 <==
1
2
3

==> /tmp/file2 <==
1.361e-11
1.339e-11
1.334e-11

==> /tmp/file3 <==
1.177e-11
1.178e-11
1.177e-11

==> /tmp/file4 <==
8.807e-12
8.805e-12
8.811e-12

==> /tmp/file5 <==
9.063e-12
8.867e-12
8.824e-12

==> /tmp/file6 <==
2.002e-08
2.002e-08
2.002e-08

==> /tmp/file7 <==
2.002e-08
2.002e-08
2.002e-08

==> /tmp/file8 <==
2.500e+01
2.500e+01
2.500e+01

==> /tmp/file9 <==
1
1
1

관련 정보