awk:将字符串与十进制值匹配并对其求和

awk:将字符串与十进制值匹配并对其求和

我有应该与数字匹配的字符串。

例如,

one is equal to 1

现在,我有一个用;分隔列的文件,我想编写一个 awk 表达式来检查第一列 $1 的 SUM 是否等于 $2。

以下是文件结构的示例

oNe-oNE ; 2
one-too ; 1

解决方案 [需要改进] 我让它只使用字符串的两个参数,比如 one-one,但我需要调整它以接受更多参数,比如 One-TOO-pots-one-one(实际上是无限制的)。

awk 'BEGIN{n=split("one 1 too 2 hello",b," ");for (i=1;i<n;i+=2) a[b[i]]=b[i+1]} {split($1,c,"-");f=tolower(c[1]);s=tolower(c[2]);print $0,"; "(a[f]+a[s]==$3?"match":"not")}' file

答案1

鉴于

oNe-oNE ; 2
one-too ; 1
One-TOO-pots-one-one ; 21
one-foo ; 1

然后

awk -F\; '
BEGIN {
  val["one"]=1;val["too"]=2;val["hello"]=4;val["pots"]=16;
}

{
  split($1,a,"[- ]");
  t = 0;
  for (i in a) {
    t += val[tolower(a[i])];
  }
  if (t == $2) print $0, "match"; else print $0, "not";
}' file

生产

oNe-oNE ; 2 match
one-too ; 1 not
One-TOO-pots-one-one ; 21 match
one-foo ; 1 match

答案2

以下是我的做法:

  1. 将字符串到数字的行放入其自己的文件中并进行解析。
  2. 进行操作FS以简化 CSV 文件的解析。

实现此目的的一种方法:

总和

FNR==NR { h[$1] = $NF; next }
FNR==1  { FS=" *[-;] *"     }
{ print $0 " ; " (h[tolower($1)] + h[tolower($2)] == $3 ? "match" : "not") }

像这样运行:

awk -f sum.awk string-to-number.txt csv.txt

输出:

oNe-oNE ; 2 ; match
one-too ; 1 ; not

相关内容