【问题标题】:Extracting Lat/Long values from multiple files and outputs to New File从多个文件中提取 Lat/Long 值并输出到新文件
【发布时间】:2014-10-24 21:08:11
【问题描述】:
[Users:~/Desktop/cross_correlated]$cat 20131102.18582702.mcp 
MCCC processed: unknown event at: Thu, 16 Oct 2014 11:09:42 CST 
station, mccc delay,    std,    cc coeff,  cc std,   pol   , t0_times  , delay_times
 ZJ.sta1     -0.0374    0.0015    0.9851    0.0098    0  APRL.BHZ   301.7639    -0.1217
 ZJ.sta2     -0.0545    0.0015    0.9907    0.0101    0  BEBP.BHZ   301.9218    -0.2967
 ZJ.sta3      0.4622    0.0015    0.9724    0.0126    0  CASY.BHZ   301.6886     0.4533
 ZJ.sta4      0.2697    0.0081    0.9819    0.0146    0  DONT.BHZ   300.7176     1.2318
 ZJ.sta5     -0.3824    0.0058    0.9805    0.0160    0  DUBY.BHZ   302.1706    -0.8733
 ZJ.sta6      0.2499    0.0015    0.9873    0.0139    0  FOOT.BHZ   302.1762    -0.2467
 ZJ.sta7     -0.5377    0.0015    0.9813    0.0132    0  GRAW.BHZ   301.8386    -0.6967
 ZJ.sta8     -0.5245    0.0015    0.9546    0.0118    0  KNYN.BHZ   302.2768    -1.1217
 ZJ.sta9      0.6591    0.0081    0.9875    0.0089    0  LEON.BHZ   302.0388     0.3000
 ZJ.staa      0.4446    0.0015    0.9878    0.0089    0  MICH.BHZ   301.5210     0.6033
 ZJ.RAPH      0.3358    0.0015    0.9891    0.0121    0  RAPH.BHZ   301.4371     0.5783
 ZJ.RKST     -0.5451    0.0015    0.9886    0.0123    0  RKST.BHZ   301.5813    -0.4467
 ZJ.xzzz     -0.6739    0.0058    0.9912    0.0100    0  SAMH.BHZ   301.9008    -0.8950
 ZJ.xyzz      0.2476    0.0015    0.9898    0.0098    0  SHRD.BHZ   302.2989    -0.3717
 ZJ.xzzz      0.0866    0.0015    0.9862    0.0114    0  SPLN.BHZ   301.7630     0.0033
Mean_arrival_time:   301.6797 
No weighting of equations. 
Window:   3.12   Inset:   1.43  Shift:   0.25 
Variance: 0.00373   Coefficient: 0.98360  Sample rate:   40.000 
Taper:   0.39 
Phase: P        
PDE    2013 11  2 18 58 27.02   **-19.171  -172.641**   10.1  0.0  6.2 

我在一个目录中有多个具有上述格式的文件。 我需要为每个文件在 PDE 行中创建一个脚本,该脚本采用我在上面突出显示的 Lat/Long 值,并将它们导出到一个两列文本文件中。

我将如何在 perl 中做到这一点?我是 Perl 的新手,但如果有某种模板可以遵循,那会很有帮助。最好,我想编写一个 perl 脚本来查找 PDE 行,计算到第 7 和第 8 个空格,然后提取这些值。我需要在脚本中指定新的文件名吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    使用 perl 单行代码

    perl -lane 'print "@F[7,8]" if /^PDE/' 20131102.18582702.mcp 
    

    说明:

    开关

    • -l:启用行尾处理
    • -a:在空间上拆分行并将它们加载到数组中@F
    • -n:为输入文件中的每个“行”创建一个 while(<>){...} 循环。
    • -e:告诉perl 在命令行上执行代码。

    Live Demo

    改用脚本

    要使用脚本,以下将创建等效逻辑。

    注意:如果要处理多个文件,可以使用注释掉的行:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    @ARGV = ('20131102.18582702.mcp');
    # @ARGV = glob('*.mcp');
    
    while (<>) {
        chomp;
        my @F = split ' ';
    
        print "@F[7,8]\n" if /^PDE/;
    }
    

    【讨论】:

    • 如果我想使用此代码,在某个目录中有多个 *.mcp 文件,我应该这样做: perl -lane 'print "@F[7,8]" if /^PDE/' *.mcp
    • 正确,如果您使用的系统支持 shell * 扩展,那么这将起作用。
    • 好的,所以在您的演示中,您注意到 是一个文件。我是否应该创建每个文件名的列表并将其用于 以便 while 循环知道循环遍历每个文件?
    • DATA 是我用来在现场演示中包含数据的特殊文件句柄。您将需要使用不同的方法来处理多个外部文件,就像我刚刚添加的那样。
    【解决方案2】:
    $ perl -l -n -a -e '$F[0] eq "PDE" && print $F[7], "\t", $F[8]' *.mcp
    

    使用awk 可能更简单:

    $ awk -v OFS='\t' '$1 == "PDE" { print $8, $9 }' *.mcp
    

    【讨论】:

      【解决方案3】:

      awk

      awk '/^PDE/{print $8,$9}' *.mcp
      

      也就是说...在所有以 PDE 开头的行上,打印第 8 和第 9 个字段,使用一个或多个空格的默认分隔符来分隔字段,并对所有扩展名为 @987654324 的文件执行此操作@。

      【讨论】:

      • 如果您要投反对票,请礼貌地解释原因。
      • 我没有投反对票...但是对表达式进行一些解释会更有用。任何其他读者都不太可能遇到完全相同的问题......就像现在一样:这个答案只对 OP 有用。
      • @ben75 我同意你的观点并添加了一些解释。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 2013-03-22
      相关资源
      最近更新 更多