テキストファイルからデータを抽出する

テキストファイルからデータを抽出する

次の形式のテキストファイルがあります。

$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 }
'

5つのヘッダー行をスキップし、ファイルに残っているデータを含むフィールドを印刷します。その名前は、2つのフィールドのみがある行でリセットされるカウンタによって定義されます。

答え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

もう一つの利点は次のとおりですsedtrprintf

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

関連情報