awk 两个正则表达式条件 - 结构复杂的复杂事务列表 csv

Posted

技术标签:

【中文标题】awk 两个正则表达式条件 - 结构复杂的复杂事务列表 csv【英文标题】:awk two regex conditions - structure convoluted complex transactions list csv 【发布时间】:2017-08-16 01:33:40 【问题描述】:

我的原始输入文件是一个预订交易列表。我对两个部分中的行感兴趣:a)交易和 b)退款。 这些始终位于 CSV 的底部并且是结构化的。

我可以通过正则表达式条件 /transaction/ print 跳过事务部分以上的所有行。

我想添加一个包含字符串“交易或退款”的列,具体取决于 csv 中的部分。所以我知道 cloumn 是交易还是退款。像

IF ($2 = "transaction" || " "  != "refunds")$7=="transaction";
IF ($2 = "refunds" || " "  != "transaction")$7=="refunds"

我在我的 gdrive 上共享 CSV 和 script.awk,希望这是可以接受的: convoluted transaction list to be structured

transaction date        via        Details     payment    fee         
             28-02-2015 invoice    txn1        44.1       0.19       
             28-02-2015 invoice    txn2        27.7       0.19       
             07-03-2015 invoice    txn3        43.1       0.19       
             09-03-2015 invoice    txn4        36.8       0.19       
             12-03-2015 invoice    txn5        26         0.19       
             13-03-2015 invoice    txn6        43.7       0.19       
             13-03-2015 invoice    txn7        25.6       0.19       
             15-03-2015 creditcard txn8        70.8       0.19       
                                  Sum         317.8       1.52       
refunds    Datum        via        Details     payment    1.52         
             18-12-2014 invoice    txn0          16           
                                  Sum            16

我的预期结果是这样的:

 date        via        Details        payment    fee     type 
 28-02-2015 invoice    txn1            44.1       0.19     transaction
 28-02-2015 invoice    txn2            27.7       0.19     transaction       
 07-03-2015 invoice    txn3            43.1       0.19     transaction       
 09-03-2015 invoice    txn4            36.8       0.19     transaction       
 12-03-2015 invoice    txn5            26       0.19       transaction       
 13-03-2015 invoice    txn6            43.7       0.19     transaction       
 13-03-2015 invoice    txn7            25.6       0.19     transaction       
 15-03-2015 creditcard txn8            70.8       0.19     transaction       

 18-12-2014 invoice    txn0            16                  refund         

我现在的sn-p:

BEGIN OFS=FS=";"
print date,payment option,detailspayment,fee,type 

/^transactions/,/^$/
if ($3=="via) next;
if ($6=="Sum") next; 
print $2 FS $3 FS $4 FS $5 FS $6 FS $7; 

【问题讨论】:

自从我上次使用 awk 已经有一段时间了,但这行 /^Transaktionen/,/^$/ 不是用 , 替换 Transaktionen 吗? 在找到 /Transaktionen/ 后,我需要打印以下所有行。给出的代码似乎有效。通过使用 /Transaktionen/ 的书,它只打印下一行。 抱歉不清楚。 $0 是整行,您当然可以将它用于 $1,它是第一个元素(字段)。添加一条记录(我猜你的意思是字段)14 美元,但只打印部分字段(13 个中的 9 个)。提供一小部分来源和预期结果将有助于[无法访问您的链接] 您提供了一些输入,但没有任何输出,您的信息和脚本 sn-p 相当混乱。例如。 $1 怎么是空的 -- if ($1 == "" || $6 != "sum") ?您的 FS 是什么让这种情况发生? edit 你的问题显示简洁、可测试的输入和与该输入相关的所需输出,两者都使用编辑器 按钮正确格式化。现在你的问题很不清楚。永远不要使用范围 btw (/start/,/end/),因为它们使琐碎的脚本变得非常简短,但考虑到最小的需求变化,需要完全重写或复制条件。始终使用标志变量 (/start/f=1 fprint /end/f=0)。 【参考方案1】:
awk '
  NR == 1 
    $1 = ""
    print $0, "type"
    type = "transaction"
    next
  
  $1 == "refunds" 
    print ""
    type = "- refund"
  
  /^ / && NF > 3 
    print $0, type
  ' input.txt |column -t

输出:

date        via         Details  payment  fee   type
28-02-2015  invoice     txn1     44.1     0.19  transaction
28-02-2015  invoice     txn2     27.7     0.19  transaction
07-03-2015  invoice     txn3     43.1     0.19  transaction
09-03-2015  invoice     txn4     36.8     0.19  transaction
12-03-2015  invoice     txn5     26       0.19  transaction
13-03-2015  invoice     txn6     43.7     0.19  transaction
13-03-2015  invoice     txn7     25.6     0.19  transaction
15-03-2015  creditcard  txn8     70.8     0.19  transaction
18-12-2014  invoice     txn0     16       -     refund

我通过column -t 运行此程序以排列列,但这会在退款之前删除添加的换行符。另一个区别是用于退款“费用”的破折号是column -t 正常工作所必需的。

在 awk 代码中,如果记录数(行号,NR)为 1,则删除第一项并打印其余项加上“type”,然后我们继续下一行。如果该行以“refunds”开头,那么我们打印一个空白行,然后将类型更改为“refund”(因为没有费用,我们用破折号表示)。最后,如果我们有前导空格并且字段数 (NF) 是 4+,我们打印行加上类型。

如果您在操作内的命令之间使用分号,则 awk 代码可以全部在一行。

【讨论】:

以上是关于awk 两个正则表达式条件 - 结构复杂的复杂事务列表 csv的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之正则表达式

Shell编程之正则表达式三剑客——awk工具

Linux学习(二十五)正则表达式awk

shell 正则表达三剑客--awk

awk中如何用正则表达式判断某位数值的位数?

用于搜索多个条件的正则表达式字符串