在两个csv文件中找到列名之间的差异?

时间:2016-01-13 09:53:05

标签: python csv awk

我有两个csv文件,其第一行是列的名称。 我想diff他们的列名集,即找出

  • 这两个文件是否具有相同的列名称(列的顺序并不重要),

  • 如果他们不知道,一个文件中的列名是什么,而另一个文件中没有...

是否可以使用awk或Linux中的其他文本处理实用程序来执行此操作? 或者使用Python更好吗?

e.g。假设一个文件看起来像

col2,col1,col3
1,2,3
4,5,6

,另一个文件看起来像

col3,col2,col4
2,3,4
5,6,7

然后第一个文件中的列名称不是第二个文件中的列名col1,而第二个文件中的列名称是col4

3 个答案:

答案 0 :(得分:3)

在Python中,首先使用csv.reader保存每个文件的标题行:

import csv
with open('one.csv', newline='') as f1, open('two.csv', newline='') as f2:
    one = set(next(csv.reader(f1)))
    two = set(next(csv.reader(f2)))

然后您可以使用set操作。

它们是否相同:

one == two

twoone但没有的列:

two - one

onetwo但没有的列:

one - two

为了好玩,两个文件都包含以下列:

one & two

所有可用列,位于任一文件中:

one | two

答案 1 :(得分:2)

如果你把它放在a.awk中

BEGIN {
    FS = ","
}
FNR == 1 && NR == 1 {
    for (i = 1; i <= NF; i++) 
        a[$i] = 1
    notA = "Not in " FILENAME ":"
}
FNR == 1 && NR != 1 {
    notB = "Not in " FILENAME ":"
    for (i = 1; i <= NF; i++) {
        if (!a[$i]) 
            notA = notA " " $i
        b[$i] = 1
    }
    for (i in a) {
        if (!b[i]) 
           notB = notB " " i
    }
    print notA
    print notB
}

运行后

awk -f a.awk foo.txt foo1.txt

您将获得输出

Not in foo.txt: col4
Not in foo1.txt: col1

答案 2 :(得分:1)

bash和工具

仅限于file1

$ comm -23 <(sed 1q file1 | tr , "\n" | sort) <(sed 1q file2 | tr , "\n" | sort)
col1

仅限于file2

$ comm -13 <(sed 1q file1 | tr , "\n" | sort) <(sed 1q file2 | tr , "\n" | sort)
col4