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語句收集

相關內容