2016-01-13 128 views
1

我有两个csv文件,其第一行是列的名称。 我想diff自己的电视机列名,即找出找到两个csv文件中列名之间的差异?

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

  • ,如果他们不这样做,哪些列名称在一个文件中,但不是在其他..

是否有可能做到这一点使用awk,或其他Linux文本处理工具? 还是使用Python更好?

例如假设一个文件看起来像

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

和其他文件看起来像

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

然后在第一个文件中的列名,但不是在二是col1,和一个第二,但不是在第一个是col4

+0

你问熟悉的awk和Python人_which one_最好用在这里,还是想提出_how_做到在任何一种语言? – TigerhawkT3

+0

我想知道如何做到这一点,然后我会知道哪里最适合在这里使用。 – Tim

回答

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 

列是two有,但one不会:

two - one 

列是one有,但two不会:

one - two 

对于乐趣,列都是fil ES有:

one & two 

和所有可用的列,两个文件:

one | two 
2

如果你把它放进一个。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 
1

bash和工具

仅在文件1

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

只在文件2

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