簡體   English   中英

找出兩個csv文件中列名之間的差異?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM