Regex 根据另一列的值更改CSV文件的列值(使用awk、vim或类似的终端命令)

Regex 根据另一列的值更改CSV文件的列值(使用awk、vim或类似的终端命令),regex,csv,awk,terminal,Regex,Csv,Awk,Terminal,我有一个表示银行交易的csv文件,如下所示: "Date","Description","Original Description","Amount","Transaction Type","Category","Account Name","Labels","Notes" "10/18/2012","Amazon","AMAZON.COM","27.60","debit","Shopping","CHASE COLLEGE","","" "10/19/2012","Virgin Ameri

我有一个表示银行交易的csv文件,如下所示:

"Date","Description","Original Description","Amount","Transaction Type","Category","Account Name","Labels","Notes"

"10/18/2012","Amazon","AMAZON.COM","27.60","debit","Shopping","CHASE COLLEGE","",""

"10/19/2012","Virgin America","VIRGIN AMER","155.90","debit","Air Travel","CREDIT CARD","",""

"10/20/2012","Airport Express","AIR EXP","16.00","credit","Credit Card Payment","CREDIT CARD","",""
"Date","Description","Original Description","Amount","Transaction Type","Category","Account Name","Labels","Notes"

"10/18/2012","Amazon","AMAZON.COM","-27.60","debit","Shopping","CHASE COLLEGE","",""

"10/19/2012","Virgin America","VIRGIN AMER","-155.90","debit","Air Travel","CREDIT CARD","",""

"10/20/2012","Airport Express","AIR EXP","16.00","credit","Credit Card Payment","CREDIT CARD","",""
我试图将其转换为第4列中的值+/-,具体取决于第5列的值。如果5表示“借方”,则第4列的值应为“-”,如果5表示“贷方”,则第4列的值应为“+”

所以输出应该是这样的:

"Date","Description","Original Description","Amount","Transaction Type","Category","Account Name","Labels","Notes"

"10/18/2012","Amazon","AMAZON.COM","27.60","debit","Shopping","CHASE COLLEGE","",""

"10/19/2012","Virgin America","VIRGIN AMER","155.90","debit","Air Travel","CREDIT CARD","",""

"10/20/2012","Airport Express","AIR EXP","16.00","credit","Credit Card Payment","CREDIT CARD","",""
"Date","Description","Original Description","Amount","Transaction Type","Category","Account Name","Labels","Notes"

"10/18/2012","Amazon","AMAZON.COM","-27.60","debit","Shopping","CHASE COLLEGE","",""

"10/19/2012","Virgin America","VIRGIN AMER","-155.90","debit","Air Travel","CREDIT CARD","",""

"10/20/2012","Airport Express","AIR EXP","16.00","credit","Credit Card Payment","CREDIT CARD","",""
最好的方法是什么?
我曾经考虑过用If语句编写一个MATLAB程序来读取该文件,但我想知道是否有一种简单的方法可以从终端执行,比如在Vim中使用AWK或RegEx

从技术上讲,你可以用一个正则表达式(或者至少一对正则表达式)来实现,但是
awk
更适合。一般来说,awk对于引用字段并不好,但是因为每个字段都引用,我们不需要使用第一个字段,所以我们可以解决这个问题

awk 'BEGIN{FS=OFS="\",\""}$5=="credit"{$4="+"$4}$5=="debit"{$4="-"$4}1' file.csv
解释

awk '
BEGIN {
    # Set the input and output field separators to ",", *with* the quotes.
    FS=OFS="\",\"" 
}

# On every line where field 5 is "credit" ...
$5 == "credit" { 
    # ... Prepend "+" to the fourth field.
    $4="+"$4 
}

# On every line where the fifth field is "debit" ...
$5 == "debit" { 
    # ... Prepend "-" to the fourth field.
    $4="-"$4
}

# Print the line
1
' test.in

嘿这是可行的,但经过一点尝试后,我认为如果我不改变值,而是将贷方和借方放在一个单独的列中,那么“金额”列将变为“贷方”,“交易类型”将变为“借方”,这将更好地满足我的需要。基本上把收入和支出放在第三列和第四列,费用列覆盖第五列的“贷方或借方”。谢谢你的帮助!