如何打印数字小于阈值的最长行序列?

69 *_*970 3 sed awk perl text-processing

我正在学习Perl,但我不知道如何解决这个问题。

我有一个.txt以下形式的文件:

1 16.3346384
2 11.43483
3 1.19819
4 1.1113829
5 1.0953443
6 1.9458343
7 1.345645
8 1.3847385794
9 1.3534344
10 2.1117454
11 1.17465
12 1.4587485
Run Code Online (Sandbox Code Playgroud)

第一列仅包含行号,此处不感兴趣,但它存在于文件中;第二列中的值是相关部分。

我想输出第二列中编号小于 2.00 的最长连续行序列。对于上面的示例,这将是第 3 行到第 9 行,输出应为:

1.19819
1.1113829
1.0953443
1.9458343
1.345645
1.3847385794
1.3534344
Run Code Online (Sandbox Code Playgroud)

avi*_*iro 5

Perl 一行:

perl -ne '$n = (split)[1]; if ($n > 2) {if ($i > $max) {$longest=$cur; $cur=""; $max=$i}; $i=0} else {$cur .= $n . "\n"; $i++} END {print $i > $max ? $cur : $longest}' < file.txt
Run Code Online (Sandbox Code Playgroud)

多行以获得更好的可读性:

perl -ne '
  $n = (split)[1];
  if ($n > 2) {
    if ($i > $max) {
      $longest=$cur;
      $cur="";
      $max=$i;
     }
     $i=0
  } else {
    $cur.= $n . "\n";
    $i++
  } 
  END {
    print $i > $max ? $cur : $longest
  }' < file.txt
Run Code Online (Sandbox Code Playgroud)

1 个内衬awk

awk '$2 > 2 { if (i > max) {res=cur; cur=""; max=i} i=0} $2 < 2 {cur = cur $2 "\n"; i++} END {if (i > max) res=cur; printf res}' file.txt
Run Code Online (Sandbox Code Playgroud)

多线:

awk '
  $2 > 2 { 
    if (i > max) {
      res=cur
      cur=""
      max=i
    }
    i=0
  } 
  $2 < 2 {
    cur = cur $2 "\n"
    i++
  }
  END {
    if (i > max) res=cur
    printf res
  }' file.txt
Run Code Online (Sandbox Code Playgroud)