我指的是此链接https://stackoverflow.com/a/54767231/11084572。
我有一个config file
和2nd column is feature
,其中3rd column is action
和config file
。我还有另一个大文件,需要将该文件的第一列与Min (3rd col),Median (4th), Max(5th)
的第一列进行匹配,并根据功能执行操作。
假设:在File.txt列中名为Apple All Max
Car abc Median
Car xyz Min
Book cvb Median
Book pqr Max
Config.txt
Apple first 10 20 30
Apple second 20 30 40
Car abc 10 20 30
Car xyz 20 30 40
Car wxyz 10 20 30
Book cvb 60 70 80
Book pqr 80 90 100
File.txt
Apple first 30
Apple second 40
Car abc 20
Car xyz 20
Car wxyz 10
Book cvb 70
Book pqr 100
预期输出:
file.txt
以上输出是通过followinfg方法生成的:
1)由于config file
较大,因此如果config file
的特征(第二列)为ALL,则所有匹配的第一列将根据{{1 }}。
2)否则,如果config file
的第二列与**substring**
匹配到file.txt
的第二列,则执行
这是我尝试过的:
awk 'BEGIN {m["Min"]=3;m["Median"]=4;m["Max"]=5}
NR==FNR{ arr[$1]=$2;brr[$1]=$3;next}
($1 in arr && arr[$1]=="All") {print $1,$2,$m[brr[$1]]}
($1 in arr && $2==arr[$1] ) {print $1 ,$2,$m[brr[$1]]}
' Config.txt File.txt
代码输出:
Apple first 30
Apple second 40
Book pqr 100
Car xyz 20
上面的输出仅打印一个匹配的第一个列的字段(例如Book cvb 70
不在打印)。另外,我如何将字符串匹配为结束字符串(例如,config.txt中定义的xyz
与file.txt的xyz and wxyz
都匹配。
请帮助我解决上述挑战。谢谢!
答案 0 :(得分:1)
您期望的示例输出与您所显示的Input_file示例不同(例如,在Car abc 200
中没有200
的Input_file示例中,如果我正确理解的话)您请尝试关注。
file.txt
输出如下。
awk '
BEGIN{
b["min"]=3
b["max"]=5
b["median"]=4
}
FNR==NR{
c[$1]
++d[$1]
a[$1 d[$1]]=tolower($NF)
next
}
($1 in c){
if(e[$1]<d[$1]){
++e[$1]
}
else{
e[$1]!=""?e[$1]:++e[$1]
}
print $1,$2,$b[a[$1 e[$1]]]
}' config.txt file.txt
说明: 现在添加上述代码的说明。
Apple first 30
Apple second 40
Car abc 20
Car xyz 20
Car wxyz 10
Book cvb 70
Book pqr 100