在awk中的两个文件处理中打印内容

时间:2019-02-22 11:48:09

标签: shell awk

我指的是此链接https://stackoverflow.com/a/54767231/11084572。 我有一个config file2nd column is feature,其中3rd column is actionconfig 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都匹配。

请帮助我解决上述挑战。谢谢!

1 个答案:

答案 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