具有多个语句的 AWK 脚本不适用于 txt 文件

AWK script with multiple statements not working on txt file

我有一个名为 an.txt 的大文件:

head -n 6 an.txt 

Type    Details Particulars Code    Reference   Amount  Date    ForeignCurrencyAmount   ConversionCharge
Bank Fee    Monthly A/C Fee             -8.50   31/03/2021      
Eft-Pos Rutherford & Bond   4835********    8848   C    210331123119    -250.00 31/03/2021      
Payment Avery Johnson   Avery Johnso    592315  Labour  -131.60 31/03/2021      
Bill Payment    Collins Tf  127 Driver  Crescent    I1600   50.00   31/03/2021      
Bill Payment    Becta Ltd   Taylormallon    Lawns   Inv 1447    46.00   31/03/2021
.
.
.

我编写了以下名为 b1.awk 的脚本:

#! /usr/bin/awk -f

BEGIN{
    FS = "\t"
    }
 ~ /Lance Te/ {
    s+=
    }
END{
    print "Lance Te Patu: " s
    } 

BEGIN{
        FS = "\t"
        }
 ~ /Matti/ {
        s+=
        }
END{
        print "Mattingly Court: " s
        }

调用时 ./b1.awk an.txt 我得到:

Lance Te Patu: 3170.17
Mattingly Court: 3170.17

这里的第一件事是结果不正确。第一个是正确的,但第二个应该不同。我不确定为什么这不起作用。第二个问题是 /Lance Te//Matti/ 是否可以作为变量传递而不是编写单独的 awk 语句,这是我理想中想要实现的。很抱歉,但我正在努力思考 awk,以免你们中的某些人觉得这有点愚蠢。

你需要相当多的读心术,但我的 crystal 球表明你可能正在寻找类似

的东西
awk -F '\t' -v regex="Matti|Lance Te" ' ~ regex { sum[] +=  }
    END { for (rcpt in sum) print rcpt ": " sum[rcpt] }' an.txt

我假设您想从 </code> 中提取全文作为实际收件人,尽管正则表达式在每种情况下只查找一个子字符串。</p> <p>更详细地说,我们将有趣的总计收集到一个关联数组 <code>sum 中,其中每个值的键是来自 </code> 的字符串,值是 <code> 来自找到密钥的行。

您尝试的直接问题是您对每个总和使用了相​​同的变量 s;您可以通过在第二组语句中使用 t 而不是 s 来简单地修复它。但是为每个搜索字符串重复代码显然是不优雅、繁琐且容易出错的。

#!/usr/bin/awk -f

BEGIN{
    FS = "\t"
}

 ~ /Lance Te|Matti/ {
    s[] += 
}

END {
    for (i in s)
        print i ": " s[i]
}