我有应该与数字匹配的字符串。
例如,
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
以下是我的做法:
- 将字符串到数字的行放入其自己的文件中并进行解析。
- 进行操作
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