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的主要内容,如果未能解决你的问题,请参考以下文章