Sorting 根据值距离打印,但考虑另一列
我有一个巨大的表,有大约200k行和列(制表符分隔)。我想根据$4这个特定列的值来选择它们,这样它们的值的间隔至少为100,但也要考虑到$3列的值。i、 eSorting 根据值距离打印,但考虑另一列,sorting,awk,Sorting,Awk,我有一个巨大的表,有大约200k行和列(制表符分隔)。我想根据$4这个特定列的值来选择它们,这样它们的值的间隔至少为100,但也要考虑到$3列的值。i、 e 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
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
要得到这样的东西:
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
不久前@hek2mgl使用此代码帮助edme根据值之间的距离过滤一个巨大的表
awk 'NR<3; NR==2{pv=$4} NR>2 && ($4-pv>=100){print;pv=$4}' file
awk'NR2&($4-pv>=100){print;pv=$4}文件
<>但是,这个代码不考虑3美元,现在我需要考虑避免为每个块创建一个新文件。考虑到$4中的值不是连续的,如果它们不代表相同的块($3),这可能会有点复杂吗
谢谢如果您想要固定的列大小,为什么不使用简单的printf
spc=10;
while read a b c d e; do
printf '%-'$spc's %-'$spc's %-'$spc's %-'$spc's %-'$spc's\n' $a $b $c $d $e;
done < file
awk
救援!
只需使用$3限定前面的值
$ awk 'NR<3; NR==2{pv[$3]=$4} NR>2 && ($4-pv[$3]>=100){print;pv[$3]=$4}' file
id tag xxx 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
$awk'NR2&($4-pv[$3]>=100){print;pv[$3]=4}文件
id标签xxx位置分数
id_1 AAAAAAAA bbbbb 3190 1
id_3 AAAAA bbbbb 3300 1
id_5 AAAAA ccccc 100 1
id_6 AAAAA ccccc 500 1
i、 e.将
pv
更改为pv[$3]
。您可以通过管道将输出传输到列-t
,以获得更好的格式,或者将print更改为printf。至少我不清楚您希望$3如何影响处理。此外,是否可以接受产生文件排序成本(按$3和$4,反之亦然)?3美元上的值表示$4上的值对应的组。许多团体以3美元为基础,价值以4美元为基础。问题是$4上的值不是连续的,这意味着一组可能以1000结束,而另一组可能以100开始。
$ awk 'NR<3; NR==2{pv[$3]=$4} NR>2 && ($4-pv[$3]>=100){print;pv[$3]=$4}' file
id tag xxx 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