使用两个标准提取行

时间:2017-09-14 12:28:07

标签: awk

希望有人可以教我如何完成这项任务。

我在想awk可能会很好,但我真的很初学。

我有一个像下面这样的文件(标签分隔,实际文件要大得多)。 这里,重要的列是第二和第九列(文件第一行中的235和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
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

我想通过指定第九列的值来提取行。此时,第二列将像枢轴列。我的意思是枢轴列,如果第二列具有相同的值,则将其视为单个数据集。在这组行中,所有行都需要在第九列中具有特定值。

因此,例如,如果我指定第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

第6和第8行有" 15"在他们的第九栏中,但是"中的其他一行" (由第二列指定:236)具有除" 14"之外的值。或" 15",所以我不想提取线条。

3 个答案:

答案 0 :(得分:2)

$ cat tst.awk
$2 != prevPivot { prtCurrSet() }
$9 !~ /^1[45]$/ { isBadSet=1 }
{ currSet = currSet $0 ORS; prevPivot = $2 }
END { prtCurrSet() }
function prtCurrSet() {
    if ( !isBadSet ) {
        printf "%s", currSet
    }
    currSet = ""
    isBadSet = 0
}

$ awk -f tst.awk file
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

答案 1 :(得分:1)

不完全确定完整的要求,看到您的预期输出,请您试试。

awk '$2 == 235 && ($9 == 14 || $9 == 15)'  Input_file

输出如下。

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 :(得分:1)

awk 表达式:

Impact, Likelihood
  • awk '$2==235 && $9~/^1[45]$/' file - 确保第9个字段与$9~/^1[45]$/14匹配