linux awk比较两个csv文件并使用标志创建一个新文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux awk比较两个csv文件并使用标志创建一个新文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2807字,纯文字阅读大概需要5分钟。
内容图文
![linux awk比较两个csv文件并使用标志创建一个新文件](/upload/InfoBanner/zyjiaocheng/961/28ee5e8da56e4217896ebb2311ecd2ff.jpg)
我有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*<$/{s//\1 D/;b};/^.*>\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] *<$/{split($0,a,"[\t]* *<$");print a[1]" D"};/>[\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
内容总结
以上是互联网集市为您收集整理的linux awk比较两个csv文件并使用标志创建一个新文件全部内容,希望文章能够帮你解决linux awk比较两个csv文件并使用标志创建一个新文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。