具有多个语句的 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]
}
我有一个名为 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]
}