从多个文件中提取Lat / Long值并输出到New File

时间:2014-10-24 21:08:12

标签: perl

[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的新手,但是如果有一种模板要遵循,那将会很有帮助。最好,我想编写一个查找PDE行的perl脚本,计算到第7和第8个空格,然后提取这些值。我是否需要在脚本中指定新文件名?

3 个答案:

答案 0 :(得分:2)

使用perl one-liner

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/;
}

答案 1 :(得分:0)

$ 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

答案 2 :(得分:0)

使用awk

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

在所有以PDE开头的行上显示...,打印第8和第9个字段,使用一个或多个空格的默认分隔符来分隔字段,并为具有扩展名的所有文件执行此操作.mcp