Awk 基于另一个文件创建一个文件

Awk 基于另一个文件创建一个文件,awk,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 您可以尝试以下pe

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

您可以尝试以下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;
}
输出为:

Range 1: 35-39
Range 2: 173-175
Range 3: 39-42
使用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}' *

更改*以符合您的文件标准。

到目前为止,您是否尝试过任何方法?非常感谢您的回答。在输出中,我需要打印提取文件的文件名。可能吗?你能解释一下代码吗?@user3531678更新了我的帖子,加入了文件名。如果您喜欢,请接受:更新后的代码与我期望的输出不符。@user3531678您应该能够像我在文章中所做的那样,将File=to>更改为。
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}' *