awk: combinando strings com valores decimais e somando-os

2

Eu tenho strings que devem corresponder aos números.

Por exemplo,

one is equal to 1

Agora, tenho um arquivo que separa colunas com; e quero escrever uma expressão awk que verifique se a soma da primeira coluna $ 1 é igual a $ 2.

Aqui está um exemplo de como o arquivo está estruturado

oNe-oNE ; 2
one-too ; 1

SOLUÇÃO [precisa de melhorias] Eu tenho que trabalhar com apenas dois argumentos para a string, como one-one, mas eu preciso adaptá-lo para aceitar mais, como One-TOO-pots-one-one (ilimitado realmente).

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
    
por Plaurs 05.03.2015 / 20:02

2 respostas

1

Dado

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

então

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

produz

oNe-oNE ; 2 match
one-too ; 1 not
One-TOO-pots-one-one ; 21 match
one-foo ; 1 match
    
por steeldriver 05.03.2015 / 20:37
0

Aqui está como eu faria isso:

  1. Coloque as linhas de string em números em um arquivo próprio e analise-as.
  2. Manipule FS para facilitar a análise do arquivo CSV.

Uma maneira de conseguir isso:

sum.awk

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

Execute assim:

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

Saída:

oNe-oNE ; 2 ; match
one-too ; 1 ; not
    
por Thor 05.03.2015 / 20:23