У меня есть строки, которые, как предполагается, соответствуют числам.
Например,
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
Данный
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
Вот то, как я сделал бы это:
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