我有两个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
。
答案 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
two
但one
但没有的列:
two - one
one
但two
但没有的列:
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