【问题标题】:comparing csv files比较csv文件
【发布时间】:2023-03-15 04:55:02
【问题描述】:

我想编写一个 shell 脚本来比较两个 .csv 文件。第一个包含文件名、路径第二个 .csv 文件包含文件名、路径、目标。现在,我想比较两个 .csv 文件并输出第一个 .csv 文件存在于第二个 .csv 文件中的目标名称。

例如。

a.csv

build.xml,/home/build/NUOP/project1  
eesX.java,/home/build/adm/acl

b.csv

build.xml,/home/build/NUOP/project1,M1
eesX.java,/home/build/adm/acl,M2
ddexse3.htm,/home/class/adm/33eFg

我希望输出是这样的。

M1 和 M2

请帮忙 谢谢,

【问题讨论】:

    标签: shell csv scripting compare


    【解决方案1】:

    如果您不一定需要 shell 脚本,您可以像这样在 Python 中轻松完成:

    import csv
    
    seen = set()
    
    for row in csv.reader(open('a.csv')):
      seen.add(tuple(row))
    
    for row in csv.reader(open('b.csv')):
      if tuple(row[:2]) in seen:
        print row[2]
    

    【讨论】:

    • “不需要 shell 脚本”。你说得好像只有 Python 才能完成这项工作。
    • 完全没有,但我觉得这样更简单。
    【解决方案2】:

    如果那些 M1 和 M2 总是在字段 3 和 5,你可以试试这个

    awk -F"," 'FNR==NR{
        split($3,b," ")
        split($5,c," ")
        a[$1]=b[1]" "c[1]
        next
    }
    ($1 in a){
        print "found: " $1" "a[$1]
    }' file2.txt file1.txt
    

    输出

    # cat file2.txt
    build.xml,/home/build/NUOP/project1,M1 eesX.java,/home/build/adm/acl,M2 ddexse3.htm,/home/class/adm/33eFg
    filename, blah,M1 blah, blah, M2 blah , end
    
    $ cat file1.txt
    build.xml,/home/build/NUOP/project1 eesX.java,/home/build/adm/acl
    
    $ ./shell.sh
    found: build.xml M1 M2
    

    【讨论】:

    • 谢谢。如果我得到 OP 的要求正确,输出仍然是一样的。
    【解决方案3】:

    试试http://sourceforge.net/projects/csvdiff/

    引用: csvdiff 是一个 Perl 脚本,用于比较/比较两个 csv 文件,并可以选择分隔符。差异将显示为:“记录 999 中的 XYZ 列”不同。在此之后,将显示该列的实际结果和预期结果。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2019-01-19
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多