Awk 基于另一个文件创建一个文件
我有一个包含以下数据的文本文件。例如,aa.txt有一些数字。我需要从中提取连续数最少3个数字。我如何使用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
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}' *