2017-09-15 74 views
1

INFILE,提取线与枢轴柱

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 
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 
S 237 1365 * 0 * * * 15 1 c474 152 
H 237 279 95 + 0 0 765I279M321I 15 1 s7689 1 
S 238 1365 * 0 * * * 12 1 c474 152 
H 238 279 95 + 0 0 765I279M321I 10-1 1 s7689 1 
H 238 301 99.7 - 0 0 908I301M156I 15 1 s8443 1 
H 238 563 95.2 - 0 0 728I563M74I 17 1 c1725 12 
H 238 97 97.9 - 0 0 732I97M536I 17 1 s11472 1 

OUTFILE我想是下面,

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

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 

例2指定第9列“14”和“15”。

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 

例3指定第九列“15”。

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

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

设置238在第九列中没有指定“12”。所以我不希望他们被提取。

此问题与此问题非常相似。 Extracting lines using two criteria

回答

1

有许多可能的方法,但恕我直言,最强大和最容易在以后进行扩展时是创建所需值的哈希表(以下goodVals[]),然后只是测试,如果当前$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 

这里是另一个:

$ 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,someBadPresent) { 
    allGoodPresent = 1 
    for (val in goodVals) { 
     if (!(val in seen)) { 
      allGoodPresent = 0 
     } 
     delete seen[val] 
    } 
    someBadPresent = length(seen) 
    if (allGoodPresent && !someBadPresent) { 
     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 

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

+0

嗨Ed, 在这个时候,我想提取一系列具有'10 -1''15''17'全部的行。例如,上面infile中的最后两行只有'15'。所以我不想提取它们。 – user2182606

+0

然后编辑您的问题以阐明您的要求。在您的示例中包含所有期望值都存在的情况,但也存在不期望的值,以便我们可以看到您希望如何处理该情况。所以你应该有3个输入集 - 1)一些好+有些不好,2)所有好+没有坏,3)所有好+有些不好。 –