我有一个非常具体的问题,并且已经能够使用 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
语句收集