从文本文件中提取特定数字

时间:2013-02-18 12:20:57

标签: regex perl sed grep

我有一个带内容的文本文件test.hd

gated window upper limit:=1.15
gated window lower limit:=0.87
gated frame mode:=variable time
gated beats accepted:=631
gated beats rejected:=1
gated longest beat:=1.0455
gated shortest beat:=0.8722
gated average beat:=0.9472
applied zoom:=2.15
zoom origin x:=272
zoom origin y:=288

在我的shell脚本中,我想使用sed或perl one liner分配一个可变的最长节拍和最短节拍。目前我可以用更多,grep和cut

来做到这一点
more test.hd | grep 'longest beat' | cut -f 2 -d =

6 个答案:

答案 0 :(得分:2)

您可以使用简单的正则表达式捕获目标值:

use strict;
use warnings;

my ($short, $long);
while (<DATA>) {
    if (/longest beat:=(\S+)/) {
        $long = $1;
    } elsif (/shortest beat:=(\S+)/) {
        $short = $1;
    }
}
print "Longest beat: $long\n";
print "Shortest beat: $short\n";

__DATA__
gated window upper limit:=1.15
gated window lower limit:=0.87
gated frame mode:=variable time
gated beats accepted:=631
gated beats rejected:=1
gated longest beat:=1.0455
gated shortest beat:=0.8722
gated average beat:=0.9472
applied zoom:=2.15
zoom origin x:=272
zoom origin y:=288

<强>输出:

Longest beat: 1.0455
Shortest beat: 0.8722

DATA文件句柄可以是您需要的任何文件句柄,当然,这仅用于演示。

更通用的版本是简单地提取所有键/值对:

my %data;
while (<DATA>) {
    chomp;
    my ($key, $value) = split /:=/, $_, 2;   # split on := max two fields
    $data{$key} = $value;
}
print "Longest beat: $data{'gated longest beat'}\n";
print "Shortest beat: $data{'gated shortest beat'}\n";

答案 1 :(得分:2)

这是使用sed的一种方式:

longest_beat=$(sed -n '/longest beat/s/.*=//p' test.hd)
shortest_beat=$(sed -n '/shortest beat/s/.*=//p' test.hd)

答案 2 :(得分:1)

此处不需要

more。您可以指定grep的文件名或将其重定向到其标准输入。然后,使用命令替换:

longest_beat=$(grep 'longest beat' test.hd | cut -d= -f2)

答案 3 :(得分:1)

这样的事情怎么样:

my ($longest_beat, $shortest_beat);

while (<DATA>) { # insert your own filehandle here
  $longest_beat  = $1, next if /longest beat:=\s*(\S+)/; 
  $shortest_beat = $1, next if /shortest beat:=\s*(\S+)/;
}

print $longest_beat, "\n";
print $shortest_beat, "\n";    

Demo

答案 4 :(得分:1)

long=`perl -F"=" -ane 'print $F[1] if(/longest beat/)' your_file`
short=`perl -F"=" -ane 'print $F[1] if(/shortest beat/)' your_file`

你也可以使用:

sed -n 's/.*longest beat:=//gp'

测试如下:

> cat temp
gated window upper limit:=1.15
gated window lower limit:=0.87
gated frame mode:=variable time
gated beats accepted:=631
gated beats rejected:=1
gated longest beat:=1.0455
gated shortest beat:=0.8722
gated average beat:=0.9472
applied zoom:=2.15
zoom origin x:=272
zoom origin y:=288
> 
> 
> 
> cat temp.sh
#!/bin/sh


long=`perl -F"=" -ane 'print $F[1] if(/longest beat/)' temp`
short=`perl -F"=" -ane 'print $F[1] if(/shortest beat/)' temp`

echo $long
echo $short
> 
> 
> ./temp.sh
1.0455
0.8722
>
> cat temp.sh
#!/bin/sh


long=`sed -n 's/.*longest beat:=//gp' temp`
short=`perl -F"=" -ane 'print $F[1] if(/shortest beat/)' temp`

echo $long
echo $short
> ./temp.sh
1.0455
0.8722
> 

答案 5 :(得分:1)

这是使用哈希捕获的一个选项:

use strict;
use warnings;

my %hash;

while (<DATA>) {
    $hash{$1} = $2 if /((?:longest|shortest) beat):=(\S+)/;
}

print "\u$_: $hash{$_}\n" for keys %hash;

__DATA__
gated window upper limit:=1.15
gated window lower limit:=0.87
gated frame mode:=variable time
gated beats accepted:=631
gated beats rejected:=1
gated longest beat:=1.0455
gated shortest beat:=0.8722
gated average beat:=0.9472
applied zoom:=2.15
zoom origin x:=272
zoom origin y:=288

输出:

Shortest beat: 0.8722
Longest beat: 1.0455