根据另一个文件创建一个文件

时间:2014-04-14 11:30:17

标签: awk

我有一个包含以下数据的文本文件。例如,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

2 个答案:

答案 0 :(得分: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

答案 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}' *

更改*以符合您的文件条件。