根据同一列的值之间的差异打印行

时间:2018-01-10 14:38:38

标签: awk

我一直在尝试过滤文本文档。

我的文件是这样的:

a score=2910 EG2=0 E=0  
s MJUT01042700.1 17232 3459 + 53939
s scaffold1|size190226 11711 3461 + 190226

a score=1427 EG2=0 E=0  
s MJUT01011585.1 1110178 1852 + 1659926
s scaffold1|size190226 96228 1834 + 190226

a score=1136 EG2=0 E=0  
s MJUT01033992.1 44701 1369 + 67673
s scaffold1|size190226 96715 1347 + 190226

a score=1074 EG2=0.02 E=0  
s MJUT01027223.1 115853 1482 + 196715
s scaffold1|size190226 140742 1471 + 190226

a score=1060 EG2=0 E=0.3  
s MJUT01027223.1 192518 1484 + 196715
s scaffold1|size190226 140742 1471 + 190226

如果对于每个三元组,第三列和第二列之间的第六列(最后一列)的差异为正,我想保留行的三元组。

例如,第一个三联体:190226 - 53939> 0,所以我打印整个三重线。

我尝试了几件事,但似乎我在处理线跳时遇到了麻烦。我的命令返回废话:)。

我绝对不习惯awk,如果下面的命令很丑,我道歉...:

awk -F " " '{
    l1=$1; l2=$2; l3=$3; l4=$4; # get line with score, Eg and E
    getline;
    ll1=$1; ll2=$2; ll3=$3; ll4=$4; ll5=$5; ll6=$6; # get "MJUT..." line
    getline;

    if ($6-ll6 >= 0) # Compare values between "MJUT..." line and "scaffold" line
        print l1, l2, l3, l4;
        print ll1, ll2, ll3, ll4, ll5, ll6;
        print $1, $2, $3, $4, $5, $6;
        print "";

    getline; # Jump to next score line
    }' myfile.txt

1 个答案:

答案 0 :(得分:1)

您可以使用特殊记录分隔符''(空字符串)在空行上分割记录,然后检查最后一个字段是否大于第10个字段:

$ awk -v RS='' '$NF > $10' infile
a score=2910 EG2=0 E=0  
s MJUT01042700.1 17232 3459 + 53939
s scaffold1|size190226 11711 3461 + 190226
a score=1136 EG2=0 E=0  
s MJUT01033992.1 44701 1369 + 67673
s scaffold1|size190226 96715 1347 + 190226