linux怎么比较两个csv,linux awk比较两个csv文件并使用标志创建一个新文件

我有2个CSV文件,我需要比较并获得新格式化文件的差异.样品如下.

旧文件

DTL,11111111,1111111111111111,11111111111,Y,N,xx,xx

DTL,22222222,2222222222222222,22222222222,Y,Y,cc,cc

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd

DTL,44444444,4444444444444444,44444444444,Y,Y,ss,ss

DTL,55555555,5555555555555555,55555555555,Y,Y,qq,qq

新文件

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx

DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc

DTL,44444444,4444444444444444,44444444444,Y,Y,ss,ss

DTL,55555555,5555555555555555,55555555555,Y,Y,qq,qq

DTL,77777777,7777777777777777,77777777777,N,N,ee,ee

输出文件

我想比较旧的和新的CSV文件,并找到在新文件中产生的更改,并更新标记以表示这些更改

U – 如果新文件记录是UPDATED

D – 如果旧文件中存在的记录在新文件中被删除

N – 如果新文件中存在的记录在旧文件中不可用

示例输出文件是这样的.

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U

DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D

DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N

我使用了diff命令,但它也会重复UPDATED记录,这不是我想要的.

DTL,11111111,1111111111111111,11111111111,Y,N,xx,xx

DTL,22222222,2222222222222222,22222222222,Y,Y,cc,cc

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd

---

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx

DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc

5a5

DTL,77777777,7777777777777777,77777777777,N,N,ee,ee

我使用AWK单行命令来过滤掉我的记录

awk 'NR==FNR{A[$1];next}!($1 in A)' FS=: old.csv new.csv

这个问题是没有得到我只属于OLD文件的记录.

是的

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd

我发起了一个驱动的bash脚本,以便对此进行讨论,但没有找到一个很好的例子.

myscript.awk

BEGIN {

FS = "," # input field seperator

OFS = "," # output field seperator

}

NR > 1 {

#flag

# N - new record D- Deleted U - Updated

id = $1

name = $2

flag = 'N'

# This prints the columns in the new order. The commas tell Awk to use the character set in OFS

print id,name,flag

}

>> awk -f myscript.awk old.csv new.csv > formatted.csv

解决方法:

这可能对你有用:

diff -W999 --side-by-side OLD NEW |

sed '/^[^\t]*\t\s*|\t\(.*\)/{s//\1 U/;b};/^\([^\t]*\)\t*\s*\t\(.*\)/{s//\1 N/;b};d'

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U

DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D

DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N

一个同样的awk解决方案:

diff -W999 --side-by-side OLD NEW |

awk '/[|][\t]/{split($0,a,"[|][\t]");print a[2]" U"};/[\t] *[\t]/{split($0,a,">[\t]");print a[2]" N"}'

DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U

DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U

DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D

DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N

标签:export-to-csv,bash,linux,awk,csv

来源: https://codeday.me/bug/20190726/1539750.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值