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

时间:2016-02-24 20:45:32

标签: sorting awk

我有这个巨大的表,有大约200k行和列(制表符分隔)。我想根据此特定列$ 4的值来选择它们,因此它们的值间隔至少为100,但也要考虑第3列的值。即

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使用此代码根据值之间的距离过滤了一个巨大的表

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

然而,这段代码并没有考虑现在我需要考虑的$ 3,以避免为每个块创建一个新文件..这可能是可能的,因为考虑到$ 4中的值不连续,它有点复杂如果他们不代表同一块($ 3)?

由于

2 个答案:

答案 0 :(得分:1)

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

即。将pv更改为pv[$3]。您可以将输出传递给column -t以获得更好的格式,或将print更改为printf。

答案 1 :(得分:0)

如果你想要一个固定的列大小,为什么不是一个简单的printf?

NSString *loadData = [[NSBundle mainBundle]pathForResource:@"Dinosaurs" ofType:@"plist"];
NSDictionary *dinoDictionary = [[NSDictionary alloc] initWithContentsOfFile: loadData];
NSString *DINOIMAGE = (NSString *)dinoDictionary[@"DINOIMAGE"];
NSLog(@"%@, %@", dinoDictionary, DINOIMAGE);

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 定义列之间的空格数

输出:

spc