[英]Find differences between column names in two csv files?
我有兩個csv文件,它們的第一行是列的名稱。 我想diff
他們的一組列名,即找出
這兩個文件是否具有相同的列名稱集(列的順序無關緊要),並且
如果沒有,則哪個列在一個文件中命名,而在另一個文件中沒有。
可以使用awk
或Linux中的其他文本處理實用程序來做到這一點嗎? 還是使用Python更好?
例如,假設一個文件看起來像
col2,col1,col3
1,2,3
4,5,6
而另一個文件看起來像
col3,col2,col4
2,3,4
5,6,7
然后,第一個文件而不是第二個文件中的列名是col1
,第二個文件而不是第一個文件中的列名是col4
。
在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
如果將其放在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
打擊和工具
僅在文件1中
$ 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.