awk: соответствующие строки к десятичным значениям и подведению итогов их

У меня есть строки, которые, как предполагается, соответствуют числам.

Например,

one is equal to 1

Теперь, у меня есть файл, который разделяет столбцы с; и я хочу записать awk выражение, которое проверяет, равна ли СУММА первого столбца 1$ 2$.

Вот пример того, как файл структурирован

oNe-oNE ; 2
one-too ; 1

Для РЕШЕНИЯ [нужно улучшение], у меня есть оно работающий только с двумя аргументами в пользу строки, как взаимно-однозначный, но я должен адаптировать его для принятия больше, как 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
2
задан 6 March 2015 в 00:25

2 ответа

Данный

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
1
ответ дан 2 December 2019 в 05:08

Вот то, как я сделал бы это:

  1. Поместите строку к числовым осям в собственный файл и проанализируйте ее.
  2. Управлять FS упрощать парсинг файла CSV.

Один способ достигнуть этого:

sum.awk

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
0
ответ дан 2 December 2019 в 05:08

Другие вопросы по тегам:

Похожие вопросы: