Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 根据值距离打印,但考虑另一列_Sorting_Awk - Fatal编程技术网

Sorting 根据值距离打印,但考虑另一列

Sorting 根据值距离打印,但考虑另一列,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

我有一个巨大的表,有大约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    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