[英]Use Awk to sum a field using regex and loop
awk 和脚本/编程和提问的新手。 希望使用 Awk 对每月系统生成的文本文件(在 Windows10 上使用 WSL1)中的字段求和。 目标行如下所示:
Client No. Client Name O/S Balance Ledger1 Ledger2 Ledger3 Ledger4 Ledger5 Ledger6 Ledger7 Comments
C00716427.1 Queensview Ohio LLC. 888,924.35 0.00 0.00 0.00 888,924.35 1,803.21 0.00 2,499.96-admin fee
C00716576.3 0140-8487 Quebec Inc 6,260,987.91 0.00 0.00 0.00 6,260,987.91 18,418.34 0.00 20.99-May 01/20 w/c
C00716868.1 0328-2400 Quebec Inc. 1,183,948.05 0.00 0.00 0.00 1,183,948.05 2,155.69 5,211.35-1,198,846.32-April 29/20 p/o
C00617231.3 Ricky Baker Enterprise 49,593,446.91 0.00 0.00 0.00 49,593,446.91 83,220.21 442,202.51- 105.14-May 01/20 w/c
C00617316.3 101287388 Sarasota LLC. 3,089,599.64 0.00 0.00 0.00 3,089,599.64 2,604.15 27,134.56- 6.08-May 01/20 w/c
C00617447.2 AmeriUnion Trade 123 6,088,229.78 0.00 0.00 0.00 6,088,229.78 24,921.06 0.00 325.26-surplus funds
我希望输出仅为 Client No. 和 Ledger7 的值(不需要标题)。 通过拼凑其他一些解决方案,这就是我混合在一起的内容:
awk '/C00/ {for(i=1;i<=NF;i++){gsub ( ",","" ); if($i ~ /[0-9]\-[a-zA-Z]/){print substr($1,4,8) " " $i} } }' April.txt
其中产生:
716427.1 2499.96-admin
716576.3 20.99-May
716868.1 5211.35-1198846.32-April
617231.3 105.14-May
617316.3 6.08-May
617447.2 325.26-surplus
仅供参考 - 总有一个“-”分隔 Ledger7 和评论。 当 Ledger6 为负值且 Ledger7 >= 100 万美元时,我的问题就会出现。
期望输出达到1201803.75
的总和:
716427.1 2499.96
716576.3 20.99
716868.1 1198846.32
617231.3 105.14
617316.3 6.08
617447.2 325.26
关于如何调整或重组我的脚本的任何想法? 如果需要更多详细信息,请告诉我。 提前致谢。
使用gnu awk
,你可以这样做:
awk 'NR>1 {
amt = gensub(/^.*[-[:blank:]]([0-9][0-9,.]*)-[^-]+$/, "\\1", 1)
gsub(/,/, "", amt)
print $1, amt
}' file
C00716427.1 2499.96
C00716576.3 20.99
C00716868.1 1198846.32
C00617231.3 105.14
C00617316.3 6.08
C00617447.2 325.26
这个怎么运作:
NR > 1
忽略标题行gensub
函数匹配并捕获位于空格或连字符之后且后跟连字符的最后一个文件数量。gsub
函数从金额字段中删除所有逗号print
只是打印带有金额的第一列您能否尝试使用所示示例进行以下,编写和测试。 在链接https://ideone.com/3oYBGq 中编写和测试
awk '
match($0,/[-[:blank:]]([0-9][0-9,.]*)-[^-]+$/){
val=substr($0,RSTART,RLENGTH)
sub(/^ +/,"",val)
sub(/ +.*$/,"",val)
num=split(val,arr,"-")
print $1,arr[num-1]
val=""
}' Input_file
说明:为以上添加详细说明。
awk ' ##Starting awk program from here.
match($0,/[-[:blank:]]([0-9][0-9,.]*)-[^-]+$/){ ##Using match function to match regex [-[:blank:]]([0-9][0-9,.]*)-[^-]+ till end of line.
val=substr($0,RSTART,RLENGTH) ##Creating val which has substring of matched regex value in current line as shown above.
sub(/^ +/,"",val) ##Substituting starting space with NULL in val here.
sub(/ +.*$/,"",val) ##Substituting space till everything in last of line in val here.
num=split(val,arr,"-") ##Splitting val value into array arr with delimoter - here.
print $1,arr[num-1] ##Printing 1st field and 2nd last value of arr here.
val="" ##Nullify val here.
}' Input_file ##Mentioning Input_file name here.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.