我有一个制表符分隔文件,如下图所示。我想找到组中特定的最小值数。在最后一列中找到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重复了结果,也不适用于最后一条记录。
答案 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