ファイルから複数のデータを抽出して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 を使用しようとするたびに3番目のフィールドの値を抽出する必要がありますが、awk特に5番目のフィールドが2つの単語で構成されているため、スクリプトを正しくインポートすることはできませんでした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実行を使用./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
% 

おすすめ記事