根据值距离打印或跳过行?

时间:2016-02-11 14:13:19

标签: awk sed filter distance

我一直试图找到一种方法来分隔我桌子上的值。 我有这个巨大的表,有大约200k行和列(制表符分隔)。我想根据这个特殊列$ 4的值来选择它们,因此它们的值间隔至少为100.即

原始表

id      tag     xxx    position score
id_1    aaaaaaa bbbbb   3190    1
id_2    aaaaaaa bbbbb   3199    1
id_3    aaaaaaa bbbbb   3300    1
id_4    aaaaaaa bbbbb   3350    1
id_5    aaaaaaa bbbbb   3366    1
id_6    aaaaaaa bbbbb   3399    1
id_7    aaaaaaa bbbbb   3576    1
id_8    aaaaaaa bbbbb   3689    1

预期结果

id      tag     xxx    position score
id_1    aaaaaaa bbbbb   3190    1
id_3    aaaaaaa bbbbb   3300    1
id_7    aaaaaaa bbbbb   3576    1
id_8    aaaaaaa bbbbb   3689    1

有什么建议吗?提前致谢

感谢所有帮助人员,但现在我想知道是否可以将它们分开来考虑另一栏中的价值。让我解释..

使用相同的例子:

id      tag     xxx    position score
id_1    aaaaaaa bbbbb   3190    1
id_2    aaaaaaa bbbbb   3199    1
id_3    aaaaaaa bbbbb   3300    1
id_4    aaaaaaa bbbbb   3350    1
id_5    aaaaaaa ccccc   100    1
id_6    aaaaaaa ccccc   500    1
id_7    aaaaaaa ccccc   550    1
id_8    aaaaaaa ccccc   599    1

我希望获得$ 3栏中每个值的空间$ 4:

     id      tag     block    position score
    id_1    aaaaaaa bbbbb   3190    1
    id_3    aaaaaaa bbbbb   3300    1
    id_5    aaaaaaa ccccc   100    1
    id_6    aaaaaaa ccccc   500    1

考虑到$ 4中的值不是连续的,如果它们不代表相同的块,那么听起来有点复杂。

3 个答案:

答案 0 :(得分:3)

它应该是这样的:

awk 'NR<3; NR==2{pv=$4} NR>2 && ($4-pv>=100){print;pv=$4}' file

更好地解释为多行版本:

# Print the first (header) and second line in any case
NR<3

# On the second line save the value of $4 to p(previous) v(alue)
# The line has already been printed
NR==2{pv=$4}

# On other lines, check if the value of $4 is at least 100 higher
# than p(revious) v(alue)
NR>2 && ($4-pv>=100) {
    print
    # Backup p(revious) v(alue)
    pv=$4
}

答案 1 :(得分:1)

解决方案需要保持当前阈值的标签。我假设每次打印值时阈值都会改变。这是一个快速的perl oneliner来实现它。

perl -lane 'BEGIN{$max=0}; if($max+100<$F[3]){print $_; $max=$F[3]}; ' example.txt

其中example.txt包含上面列出的值。

答案 2 :(得分:1)

awk救援!

$ awk 'NR==1 || $4-v>100 && v=$4' data

id      tag     xxx    position score
id_1    aaaaaaa bbbbb   3190    1
id_3    aaaaaaa bbbbb   3300    1
id_7    aaaaaaa bbbbb   3576    1
id_8    aaaaaaa bbbbb   3689    1

假设值非零且第一个值大于100.