
我有一個非常具體的問題,並且已經能夠使用 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
語句收集