1

awk、sed、shellで解決する必要のあるテキスト操作の問題があります。
私のテキストは次のようになります。

>Sample_1
    100                                                            101
    aaattattacaaaaataattacaaattattacaaaaagaattattacaaaaagaattacaaaa
-1.60   .(((((((.....)))))))...........................................  []
>Sample_2
    1                                35
    aattattacaaaaagaattattacaaaaagaatta
0.00    ...................................  _
>Sample_3
    1                                     123
    gctcacacctgtaatcccagcactttgggaggctgagg
-27.80  ((((.....))))......((((((.(((...))))))).)[][][[][]]
-26.40  (((((.((...(((((..((((((....)).........  [[][]][]
-25.80  ((((.....)))).....((((((...............  [][][][[][]]
    123                                  145
    ctgaggcaggcagatcacgaggtcacgagatcaa
-26.20  (((.....))))))  [][][[][]]
-25.90  ....((((..((....))  [][[][]]
-25.70  ..(((..((....))..(())  [[][]][[][]]
    145                                 256
    gtaatcccagcactttgggaggctgaggcaggcaga
0.00    ...........................................  _
    256                                 342
-25.00  ..((....((((.....((((((...)))....))...  [[][]]
-24.00  ..((.((((.((((())...  [[][][]]
-23.70  .((((((...(((((..((..  [[][]][]

したい:

  1. サンプル名を抽出します(>Sample_1);
  2. サンプル名の後に続く数値を抽出します(0または負の値)。
  3. 負の値のグループ(例-27.80;-26.40;-25.80)から、最初に行く番号を抽出します(これが最も負の値です)。

完璧な出力は次のようになります。

>Sample_1  
-1.60  
>Sample_2  
0.00  
>Sample_3  
-27.80  
-26.20  
0.00  
-25.00

$ 1、grepping'>'、0&負の値を印刷するawkでこれを実行しようとしましたが、列をグループに分割できず、最も負の値を抽出できませんでした。

awk '{print $1}' file | egrep -i '>|0.00|-'
4

2 に答える 2

3

sed質問にとでタグを付けましawkたが、代わりにPerlで問題がない場合は、次のように書くことができます。

#!/usr/bin/perl -w

use warnings;
use strict;

my $min = undef;

while(<>)
{
  if(m/^(-?\d+\.\d+)/)
  {
    if(! defined($min) || $1 < $min)
      { $min = $1; }
  }
  else
  {
    if(defined $min)
    {
      print "$min\n";
      $min = undef;
    }
    if(m/^>/)
      { print; }
  }
}

if(defined $min)
  { print "$min\n"; }
于 2012-09-23T19:12:59.003 に答える
1
awk '/^[0-]/ && new_group {print $1} {new_group = (/^[ \t]/)} /^>/' file
于 2012-09-23T19:52:32.583 に答える