我有一个包含以下数据的文本文件。例如,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
答案 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}' *
更改*
以符合您的文件条件。