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

Print or skip lines according to value distance?

我一直在努力寻找一种方法来 space 计算出 table 上的值。 我有这个巨大的 table,有 ~200k 行和列(制表符分隔)。我想根据这个特定列 $4 的值来选择它们,因此它们的值至少为 spaced 100。即

原版table

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

有什么建议吗?提前致谢

感谢大家的帮助,但现在我想知道是否可以 space 他们也考虑另一列中的值。让我解释一下..

使用相同的示例:

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 列中的每个值达到 space $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 中的值如果不代表同一块则不连续,这听起来有点复杂..

它应该是这样的:

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

更好地解释为多行版本:

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

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

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

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

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

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

awk 救援!

$ awk 'NR==1 || -v>100 && v=' 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。