regex - 使用 Awk 使用正则表达式和循环对字段求和

标签 regex awk windows-subsystem-for-linux

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

我希望输出只是客户编号和 Ledger7 的值(不需要 header )。通过将其他一些解决方案拼凑在一起,这就是我混合在一起的内容:

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 简单地打印第一列的数量

关于regex - 使用 Awk 使用正则表达式和循环对字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64420837/

相关文章:

linux - 我无法通过 awk 脚本处理记录集

linux - 使用 AWK 并将结果设置为 bash 变量/数组?

perl - bash 通过匹配列合并文件

bash - 通过远程 WSL 扩展在 vscode 中使用 WSL bash 与在 Windows 中选择作为默认 shell 来使用它有何不同?

java - 正则表达式以某种方式组合 AND 操作数、NOT 操作数和捕获组

Python 正则表达式无法正常工作

linux - 在 Ubuntu 18.04 WSL 上安装 MariaDB - 问题 系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作

python - 导入 Turicreate 出现错误 No module named 'turicreate.cython.cy_unity'

regex - 引用-此正则表达式是什么意思?

java - 简单(我认为)场景需要正则表达式帮助