根据值距离打印或跳过行?
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。
我一直在努力寻找一种方法来 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。