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
我希望输出仅为ClientNo.和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.