파일에서 여러 데이터를 추출하여 csv 파일에 저장하는 방법은 무엇입니까?

파일에서 여러 데이터를 추출하여 csv 파일에 저장하는 방법은 무엇입니까?

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

19-08-02  Name                         appel    ok    hope    local  merge   (mk)
                                                        juin    nov    sept    oct
00:00:t1  T1                            299       0      24      8      3     64
          F2                            119       0      11      8      3     62
          I1                             25       0       2      9      4     64
          F3                            105       0      10      7      3     61
          Regulated F2                    0       0       0
          FR T1                         104       0      10      7      3     61
00:00:t2  T1                            649       0      24      8      3     64
          F2                            119       0      11      8      3     62
          I1                            225       0       2      9      4     64
          F3                            165       0      10      7      3     61
          Regulated F2                    5       0       0
          FR T1                         102       0      10      7      3     61
20-08-02  Name                          appel    ok    hope    local  merge   (mk)
                                                        juin    nov    sept    oct
00:00:t5  T1                            800       0      24      8      3     64
          F2                            111       0      11      8      3     62
          I1                             250      0       2      9      4     64
          F3                            105       0      10      7      3     61
          Regulated F2                    0       0       0
          FR T1                         100       0      10      7      3     61

CSV file일부 데이터를 추출하여 다음 형식으로 다른 파일 에 쓰고 싶습니다 .

            T1   F2     I1      F3    Regulated F2    FR T1
00:00:t1    299  119    25      105       0           104  
00:00:t2    649  119    225     165       5           102
00:00:t5    800  111    250     105       0           100
.......

appel00:00:XX 을 사용하려고 할 때마다 세 번째 필드의 값을 추출 하면 되지만 awk특히 다섯 번째 필드가 두 단어로 구성되어 있기 때문에 스크립트를 올바르게 가져오는 데 성공하지 못했습니다 Regulated F2. 개별 단어로 추출하는 방법을 모르겠습니다.

도와주세요!

답변1

펄 사용:

perl -lane 'BEGIN{ print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/){ @f[0] = $F[0]; @f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5){ $f[$i] = $F[1] }else{ $f[$i] = $F[2] } } print(@f) }' file

확장 스크립트(실행 파일 사용 chmod +x script.pl및 run 사용 ./script.pl file):

#!/usr/bin/perl -lan
BEGIN {
    print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1");
    $, = "\t"
}
if($F[0] =~ /00:00:t[0-9]+/) {
    $f[0] = $F[0];
    $f[1] = $F[2];
    for($i = 2; $i < 7; $i++) {
        $_ = <>;
        @F=split();
        if($i < 5) {
            $f[$i] = $F[1]
        }
        else {
            $f[$i] = $F[2]
        }
    }
    print(@f) 
}

헤더를 수정하여 조정할 수 print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1");있으며 출력 필드 구분 기호를 수정하여 조정할 수 있습니다 $, = "\t".

% cat file
19-08-02  Name                         appel    ok    hope    local  merge   (mk)
                                                        juin    nov    sept    oct
00:00:t1  T1                            299       0      24      8      3     64
          F2                            119       0      11      8      3     62
          I1                             25       0       2      9      4     64
          F3                            105       0      10      7      3     61
          Regulated F2                    0       0       0
          FR T1                         104       0      10      7      3     61
00:00:t2  T1                            649       0      24      8      3     64
          F2                            119       0      11      8      3     62
          I1                            225       0       2      9      4     64
          F3                            165       0      10      7      3     61
          Regulated F2                    5       0       0
          FR T1                         102       0      10      7      3     61
20-08-02  Name                          appel    ok    hope    local  merge   (mk)
                                                        juin    nov    sept    oct
00:00:t5  T1                            800       0      24      8      3     64
          F2                            111       0      11      8      3     62
          I1                             250      0       2      9      4     64
          F3                            105       0      10      7      3     61
          Regulated F2                    0       0       0
          FR T1                         100       0      10      7      3     61
% perl -lane 'BEGIN{ print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/){ @f[0] = $F[0]; @f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5){ $f[$i] = $F[1] }else{ $f[$i] = $F[2] } } print(@f) }' file
        T1  F2  I1  F3  Regulated F2    FR T1
00:00:t1    299 119 25  105 0   104
00:00:t2    649 119 225 165 5   102
00:00:t5    800 111 250 105 0   100
% 

답변2

작업은 매우 간단합니다. 날짜로 시작하거나 월 열을 포함하는 행을 무시합니다. 첫 번째 행에 테스트 시간이 포함되어 있으면 해당 시간과 다른 모든 행에 대해 세 번째 열을 가져옵니다. 아래 스크립트가 AWK바로 그 일을 합니다.

데모:

$> ./data2cvs.awk  testData.txt                                                  
T1,F2,I1,F3,Regulated F2,FR T1
00:00:t1,299,119,25,105,0,104
00:00:t2,649,119,225,165,5,102
00:00:t5,800,111,250,105,0,100

스크립트 소스

#!/usr/bin/awk -f 

BEGIN {  
  HEADER="T1,F2,I1,F3,Regulated F2,FR T1"; print HEADER  
} 
# Ignore lines containing date and month
$1~/^[[:digit:]]{2}-.+/ || $0~/juin.*nov.*sept.*oct/ { 
     next ; 
}  
# Grab test time and first data value 
# Essentially doing something like sprintf in C
# to a string of arrays
$1~/^[[:digit:]]{2}:.+/{ 
     count++
     DATA[count]=$1","$3 
  }   
# grab remaining data values
$1 !~ /^[[:digit:]]{2}:.+/{

   if ($1~/Regulated/ || $1~/FR/){ 
      DATA[count]=DATA[count]","$3
   }
   else {
       DATA[count]=DATA[count]","$2 ;
   }
} 
# print gathered data to STDIN
END{ 
   for (i=1;i<=count;i++) print DATA[i] 

}

관련 정보