用枢轴列提取线

时间:2017-09-15 14:19:28

标签: awk

Infile,

S   236 1365    *   0   *   *   *   15  1   c474    152
H   236 279 95  +   0   0   765I279M321I    10-1    1   s7689   1
H   236 301 99.7    -   0   0   908I301M156I    15  1   s8443   1
H   236 563 95.2    -   0   0   728I563M74I 17  1   c1725   12
H   236 97  97.9    -   0   0   732I97M536I 17  1   s11472  1

Outfile我想要的是下面的,

示例1通过指定第九列“10-1”,“15”和“17”。

S   235 1365    *   0   *   *   *   15  1   c81 592
H   235 296 99.7    +   0   0   3I296M1066I 14  1   s15018  1
H   235 719 95.4    +   0   0   174D545M820I    15  1   c2664   10
H   235 764 99.1    +   0   0   55I764M546I 15  1   c6519   4
H   235 792 100 +   0   0   180I792M393I    14  1   c407    107

示例2通过指定第九列“14”和“15”。

S   237 1365    *   0   *   *   *   15  1   c474    152
H   237 279 95  +   0   0   765I279M321I    15    1   s7689   1

示例3通过指定第九列“15”。

{{1}}

所以我想提取第二列中具有相同值的行集。此时,我只需要提取在第9列中具有特定值的一组行。在这种情况下,这组行需要具有“所有指定值”。

第238列中的集合238具有“12”,未指定。所以我不希望它们被提取出来。

这个问题与这个问题非常相似。 this article

1 个答案:

答案 0 :(得分:1)

有许多可能的方法,但恕我直言最强大,最容易扩展的是,创建一个所需值(下面goodVals[])的哈希表,然后测试当前{{1 }}是一个不在该表中的值:

$9

鉴于您的评论中有新的要求,以下是对该要求的一种可能解释的解决方案:

BEGIN { split("10-1 15 17",tmp); for (i in tmp) goodVals[tmp[i]] }
$2 != prevPivot { prtCurrSet() }
!($9 in goodVals) { isBadSet=1 }
{ currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet() {
    if ( !isBadSet ) {
        printf "%s", currSet
    }
    currSet = ""
    isBadSet = 0
}

又来了另一个:

$ cat tst.awk
BEGIN { split("10-1 15 17",tmp); for (i in tmp) goodVals[tmp[i]] }
$2 != prevPivot { prtCurrSet() }
{ seen[$9]; currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet(    val,allGoodPresent) {
    allGoodPresent = 1
    for (val in goodVals) {
        if ( !(val in seen) ) {
            allGoodPresent = 0
        }
    }
    if ( allGoodPresent ) {
        printf "%s", currSet
    }
    currSet = ""
    delete seen
}

$ awk -f tst.awk file
S   236 1365    *   0   *   *   *   15  1   c474    152
H   236 279 95  +   0   0   765I279M321I    10-1    1   s7689   1
H   236 301 99.7    -   0   0   908I301M156I    15  1   s8443   1
H   236 563 95.2    -   0   0   728I563M74I 17  1   c1725   12
H   236 97  97.9    -   0   0   732I97M536I 17  1   s11472  1

不幸的是,您发布的样本输入/输出不足以测试差异。