我一直试图找到一种方法来分隔我桌子上的值。 我有这个巨大的表,有大约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中的值不是连续的,如果它们不代表相同的块,那么听起来有点复杂。
答案 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.