【问题标题】:Shell script to highlight the difference like what is updated and added in between two csv fileShell脚本突出显示两个csv文件之间更新和添加的差异
【发布时间】:2021-10-07 02:12:36
【问题描述】:

下面是两个 csv 文件,我们需要将这两个文件与第一列进行比较

 NewFile.csv
 -----------
data1,   A 
data2.5,  B 
data3,  C
data4.3, D
data5,  E
data6,  F

OldFile.csv
------------
data1,  A
data2,  B
data3,  C
data4,  D
data5,  E

如下输出文件

OutputFile.csv
-------------
Updated
data2.5,    B
data4.3,    D
Added   
data6, F

我正在使用以下命令来执行此操作,但它只是向我展示了所有差异,需要将其分开,就像在 NewFile.csv 中更新和新添加的内容一样

awk -F',' 'FNR==NR{a[$1];next};!($1 in a)'  NewFile.csv  OldFile.csv

上述命令的输出文件:-

data2.5,    B
data4.3,    D
data6, F

但我正在寻找一个输出,我可以清楚地声明它正在使用 shell 脚本在新的输出中添加和更新。

【问题讨论】:

  • 你的字段分隔符是什么?逗号或制表符或逗号和制表符或逗号和多个空格?
  • 逗号分隔符@Cyrus
  • 您认为何时更新而不是添加记录?如果记录与旧记录位于同一位置,则记录是否已更新,或者如果第二列相同,则记录是否已更新?
  • 是否更新了记录,如果它与旧记录在同一位置 - 是@Socowi

标签: bash shell scripting


【解决方案1】:

以下脚本标识了那些行

  • 修改(两个文件中相同的行号具有不同的第一个字段)
  • 添加NewFile.csv 中不在OldFile.csv 中的所有行号)

不考虑删除的行。

awk -F, -v oldfile=OldFile.csv 'BEGIN {print "Updated"}
{new0=$0; new1=$1; if (!added && !getline < oldfile) {print "Added"; added=1}}
!added && new1!=$1 {print new0}
added' NewFile.csv

对于你的例子,这个打印

Updated
data2.5,  B
data4.3, D
Added
data6,  F

UpdatedAdded 总是被打印出来,即使没有这样的行。

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2018-01-06
    • 1970-01-01
    • 2011-01-19
    • 2015-01-24
    • 2022-12-07
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多