打印距离当前模式匹配最远的特定行数,并在匹配另一个模式之前

时间:2013-12-24 12:52:19

标签: regex perl bash scripting awk

我有一个制表符分隔文件,如下图所示。我想找到组中特定的最小值数。在最后一列中找到E后,该组开始。例如,我想打印最远的两行(记录),第一次出现E,项目按E列排序。这里是Jack的案例,也是在Gareth案例中第二次出现E之后。

Jack    2   98  E
Jones   6   25  8.11
Mike    8   11  5.22
Jasmine 5   7   4
Simran  5   7   3
Gareth  1   85  E
Jones   4   76  178.32
Mark    11  12  157.3
Steve   17  8   88.5
Clarke  3   7   12.3
Vid     3   7   2.3

我希望我的结果是

Jasmine 5   7   4
Simaran 5   7   3
Clarke  3   7   12.3
Vid     3   7   2.3

组中可以有不同数量的记录。我试过用grep

grep -B 2 F$ inputfile.txt

但是它用E重复了结果,也不适用于最后一条记录。

4 个答案:

答案 0 :(得分:3)

快速&脏:

kent$  awk '/E$/&&a&&b{print b RS a;a=b="";next}{b=a;a=$0}END{print b RS a}' file
Jasmine 5   7   4
Simran  5   7   3
Clarke  3   7   12.3
Vid     3   7   2.3

答案 1 :(得分:1)

我最后一栏中没有看到F。但是假设你想得到一条以E:

结尾的行的每两行
grep -B2 'E$' <(cat inputfile.txt;echo "E")|sed "/E$\|^--/d"

应该做的伎俩

  • 'E$'在一行的末尾寻找“E”
  • -B2之前还有2行
  • <(cat inputfile.txt;echo "E")添加“E”作为最后一行以匹配最后一行(这不会影响实际文件)
  • sed "/E$\|^--/d"删除所有以“E”结尾或以“ - ”开头的行(grep的分隔符)

答案 2 :(得分:1)

在Gnu Awk版本4中使用数组数组,您可以尝试

gawk -vnum=2 -f e.awk input.txt

其中e.awk是:

$4=="E" {
    N[j++]=i
    i=0
}
{
    l[j][++i]=$0
}

END {
    N[j]=i; ngr=j
    for (i=1; i<=ngr; i++) {
        m=N[i]
        for (j=m-num+1; j<=m; j++)
            print l[i][j]
    }
}

答案 3 :(得分:0)

awk '$2 ~/5|3/ && $3 ~/7/' file
Jasmine 5   7   4
Simran  5   7   3
Clarke  3   7   12.3
Vid     3   7   2.3