2014-04-14 44 views
0

我有一個包含以下數據的文本文件。例如,aa.txt有一些數字。我需要從中提取連續的數字(最少3個數字)。我可以如何使用awk來做到這一點?基於另一個文件創建文件

>aa.txt 
31 
35 
36 
37 
38 
39  
44 
169 
170 
173 
174 
175 
177 
206 
>1a.txt 
39 
40 
41 
42 
146 
149 
151 

我的理想輸出如下所示。

>aa.txt 
35 
36 
37 
38 
39 
173 
174 
175 
>1a.txt 
39 
40 
41 
42 
+1

到目前爲止,你有嘗試過什麼嗎? –

回答

0

使用awk和你示例數據:

awk 'f+1==$0 {a++} f+1!=$0 {if (a>1) {for (i=f-a;i<=f;i++) print i}a=0} {f=$0}' file 
35 
36 
37 
38 
39 
173 
174 
175 
39 
40 
41 
42 

一些更可讀:

awk ' 
f+1==$0 { 
    a++} 
f+1!=$0 { 
    if (a>1) { 
     for (i=f-a;i<=f;i++) 
      print i 
     }a=0 
    } 
    {f=$0} 
    ' file 

如何打印文件名:

awk 'FNR==1 {print ">"FILENAME} f+1==$0 {a++} f+1!=$0 {if (a>1) {for (i=f-a;i<=f;i++) print i}a=0} {f=$0}' * 

更改*以匹配您的文件標準。

+0

非常感謝您的回答。在輸出中,我需要打印提取文件的文件名。可能嗎?你能解釋一下代碼嗎? – user3531678

+0

@ user3531678更新我的文章以包含文件名。如果你喜歡它接受它:) – Jotne

+0

更新的代碼不打印像我想要的輸出。 – user3531678

0

你可以試試這個perl腳本:在命令行

#! /usr/bin/perl 

use v5.12; 
use Text::Trim qw(trim); 

my ($cur, $prev, $start); my $n=1; my $i=1; 
while (<>) { 
    trim $_; 
    if ($.>1) { 
     $cur=$_; 
     if ($cur==$prev+1) { 
      $start=$prev if ($n==1); 
      $n++; 
     } else { 
      if ($n>=3) { 
       say "Range $i: $start-$prev"; 
       $i++; 
      } 
      $n=1; 
     } 
    } 
    $prev=$cur; 
} 

運行它./test.pl file其中file是您的樣本文件。

對於樣品輸入文件:

31 
35 
36 
37 
38 
39  
44 
169 
170 
173 
174 
175 
177 
206 
39 
40 
41 
42 
146 
149 
151 

的輸出是:

Range 1: 35-39 
Range 2: 173-175 
Range 3: 39-42 
相關問題