0

内容を含むテキストファイル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

私のシェルスクリプトでは、sedまたはperl one linerを使用して、可変の最長ビートと最短ビートを割り当てたいと思います。現時点では、より多くのgrepとカットでそれを行うことができました

more test.hd | grep 'longest beat' | cut -f 2 -d =
4

6 に答える 6

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";
于 2013-02-18T12:31:38.997 に答える
2

使用する1つの方法は次のsedとおりです。

longest_beat=$(sed -n '/longest beat/s/.*=//p' test.hd)
shortest_beat=$(sed -n '/shortest beat/s/.*=//p' test.hd)
于 2013-02-18T12:43:25.990 に答える
1

moreここでは必要ありません。のファイル名を指定するgrepか、標準入力にリダイレクトすることができます。次に、コマンド置換を使用します。

longest_beat=$(grep 'longest beat' test.hd | cut -d= -f2)
于 2013-02-18T12:28:25.520 に答える
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";    

デモ

于 2013-02-18T12:30:27.533 に答える
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
> 
于 2013-02-18T12:38:03.170 に答える
1

ハッシュ付きのキャプチャを使用する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
于 2013-02-18T19:44:31.240 に答える