从文本文件中提取数据

从文本文件中提取数据

我有一个以下格式的文本文件:-

$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 行并从三行集中提取 9 个数值,所有这些值都使用 awk 命令放在 9 个不同的输出文件中。
输出文件的示例是:-
File1.txt

1  
2  
3  
1000  

文件2.txt

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

对于三行集合中的所有九个元素都是相同的。

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

相关内容