【问题标题】:How to compare two csv files in UNIX and create delta ( modified/ new records )如何在 UNIX 中比较两个 csv 文件并创建增量(修改/新记录)
【发布时间】:2017-03-23 07:17:46
【问题描述】:

我有两个 csv 文件 old.csv 和 new.csv。我只需要 new.csv 文件中的新记录或更新记录。如果 old.csv 中存在记录,则从 new.csv 中删除记录。

old.csv

"R","abc","london","1234567"
"S","def","london","1234567"
"T","kevin","boston","9876"
"U","krish","canada","1234567"

new.csv

"R","abc","london","5678"
"S","def","london","1234567"
"T","kevin","boston","9876"
"V","Bell","tokyo","2222"

new.csv 中的输出

"R","abc","london","5678"     
"V","Bell","tokyo","2222"

注意:如果 new.csv 中的所有记录都相同,那么 new.csv 应该为空

【问题讨论】:

    标签: unix awk


    【解决方案1】:

    例如使用grep:

    $ grep -v -f old.csv new.csv # > the_new_new.csv 
    "R","abc","london","5678"
    "V","Bell","tokyo","2222"
    

    和:

    $ grep -v -f old.csv old.csv
    $                            # see, no differencies in 2 identical files
    

    man grep:

      -f FILE, --file=FILE
              Obtain  patterns  from  FILE,  one  per  line.   The  empty file
              contains zero patterns, and therefore matches nothing.   (-f  is
              specified by POSIX.)
    
      -v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)
    

    再一次,你可以使用 awk:

    $ awk 'NR==FNR{a[$0];next} !($0 in a)' old.csv new.csv
    "R","abc","london","5678"
    "V","Bell","tokyo","2222"
    

    解释:

    awk '
    NR==FNR{            # the records in the first file are hashed to memory
        a[$0]
        next
    } 
    !($0 in a)          # the records which are not found in the hash are printed
    ' old.csv new.csv   # > the_new_new.csv 
    

    【讨论】:

    • 您的答案没有awk?奇怪:),我也认为我们应该将其添加为awk Wiki FAQ 的一部分,一周中的每一天都有这样的问题!也许 Ed Morton 可以在这方面有发言权。
    • awk 解决方案要快得多。
    【解决方案2】:

    文件排序时:

    comm -13 old.csv new.csv
    

    当它们没有被排序,并且允许排序时:

    comm -13 <(sort old.csv) <(sort new.csv)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      相关资源
      最近更新 更多