AWK:没有标题的行的嵌套条件子集

AWK:没有标题的行的嵌套条件子集

我有一个非常具体的问题,并且已经能够使用 awk 找到很多关于条件子集的内容,但没有一个可以为我提供足够明确的代码来概括我的情况。我有一个文件“keys”和一个文件“features”没有标题。 “keys”表包含两个变量,KEY 和 GROUP(分别是第一列和第二列),示例如下。

    1          GROUP0
    2          GROUP0
    3          GROUP1
    4          GROUP1
    5          GROUP2
    6          GROUP2  

文件“features”包含像这样的小部件的功能列表(分别为 ID、FEATURE、VALUE 第一、第二和第三列)。

    A           num_user     10
    A           KEY          4
    B           num_user     2
    B           KEY          2
    B           battery      Large
    C           num_user     10
    C           KEY          15
    D           num_user     2
    D           KEY          2
    D           battery      Small
    E           num_user     2
    E           KEY          7
    E           battery      Small

我正在尝试选择 ID 的所有行,该 ID 的值为“KEY”,该 ID 位于“keys”的“KEY”列中,用于“GROUP”值的硬编码列表。期望的结果是

    A           num_user     10
    A           KEY          4
    B           num_user     2
    B           KEY          2
    B           battery      Large
    D           num_user     2
    D           KEY          2
    D           battery      Small

有任何想法吗?

答案1

这是 awk 的 3 遍方法:

FNR == 1 {
        fn++        # counter for File Number, starts at 1
}

fn == 1 {
        key[$1] = 1 # first file: store keys
}

fn == 2 && $2 == "KEY" && $3 in key {
        id[$1] = 1  # second file, first pass: store id's
}

fn == 3 && $1 in id # second file, 2nd pass: print rows

假设上面的内容保存在 中selectrows.awk,请像这样使用它:

awk -f selectrows.awk keys.txt features.txt features.txt

或者,全部写在一行上:

awk 'FNR == 1 {f++}; f == 1 {k[$1]}; f == 2 && $2=="KEY" && $3 in k {i[$1]}; f == 3 && $1 in i' keys.txt features.txt features.txt

答案2

假设您在文件中有键/组关系keys,并且文件中有您的功能,features那么下面将根据您提供的输入获得预期结果:

awk '{print $2}' keys | sort -u | xargs -i_group awk '{if($2=="_group")print $1}' keys | sort -u | xargs -i_key awk '{if ($3=="_key" && $2=="KEY")print $1}' features | sort -u | xargs -i_id awk '{if($1=="_id")print $0}' features

它只是一种解决方案,不一定是好的解决方案,甚至可能是性能最差的解决方案,但仍然是一个。

答案3

我找到了这个更短的解决方案:

grep -P "^\ +[`awk '$3==""{a[$1]=$2}; $2=="KEY" && $3 in a {printf "%s", $1}' \
<(cat keys features)`]" features

它生成一个如下所示的命令:

grep -P "^\ +[ABD]" features

...ABD中间的 - 部分由awk语句收集

相关内容