【问题标题】:awk: substituting strings for decimals and summingawk:用字符串替换小数并求和
【发布时间】:2015-05-06 10:51:36
【问题描述】:

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

例如,

one is equal to 1
too 2
hello 4
pots 16

它们用'-'分隔,并且这些是唯一使用的,所以

one-one sums to 2
One-oNe sums to 2
one-one-too-one sums to 5

不区分大小写!

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

这是文件结构的示例

oNe-oNE ; 2
one-too ; 1

这是想要的输出

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

我知道如何对 awk 中的一列中的数字求和(例如:awk '{ sum+=$1} END {print sum}'),但我不知道如何使字符串与数字相对应,然后对它们求和。我应该使用正则表达式和替换吗?

【问题讨论】:

    标签: awk


    【解决方案1】:

    这里有一个awk 解决方案:

    cat key
    one 1
    too 2
    hello 4
    pots 16
    

    cat file
    oNe-oNE ; 2
    one-too ; 1
    

    awk 'FNR==NR {a[$1]=$2;next} {split($1,b,"-");f=tolower(b[1]);s=tolower(b[2]);print $0,"; "(a[f]+a[s]==$3?"match":"not")}' key file
    oNe-oNE ; 2 ; match
    one-too ; 1 ; not
    

    key文件客栈添加到awk

    awk 'BEGIN{n=split("one 1 too 2 hello 4 pots 16",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 ; match
    one-too ; 1 ; not
    

    【讨论】:

    • 谢谢,如果您能想出一个不用“密钥”文件的方法,请告诉我。
    • @user3295674 你喜欢把关键数据保存在awk,还是一个变量中。
    • 无论哪种方式都可以,我认为在脚本内的变量中会很棒!
    • @user3295674 帖子已更新。如果没问题,请采纳。
    • 它几乎是正确的,但如果输入包含类似的东西,它应该给出匹配,POTS-heLLO-Hello-HELLO : 28 : match 时它不起作用。似乎当它超过两个链接的单词时,它并没有全部阅读。 *我应该编辑 for 循环来解决这个问题吗?
    猜你喜欢
    • 2016-08-27
    • 2017-02-08
    • 2011-08-15
    • 1970-01-01
    • 2013-11-04
    • 2012-10-15
    • 2015-01-13
    • 1970-01-01
    • 2014-06-20
    相关资源
    最近更新 更多