【问题标题】:awk two regex conditions - structure convoluted complex transactions list csvawk 两个正则表达式条件 - 结构复杂的复杂事务列表 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} f{print} /end/{f=0})。

标签: regex awk multiple-conditions


【解决方案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 代码可以全部在一行。

【讨论】:

    猜你喜欢
    • 2018-01-17
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2019-04-30
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多