Text-Processing

比較 csv 文件的兩列並僅顯示不匹配的記錄

  • April 26, 2021

我有以下格式的 csv 文件

1311,0008,a131,a131,7039
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099
1711,2048,a626565,a626565,7035

我想要的是僅比較第 3 列和第 4 列,如果它們不匹配,則在新文件中列印該行,如果它們匹配,則在另一個文件中列印該行

預期的 File1 輸出(其中 col 3 和 4 不匹配):

1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099

File2 中的預期輸出(其中 col 3 和 4 匹配):

1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035

到目前為止,我只嘗試了與多個文件的比較。

兩個非常短的命令,只是為了簡單起見:

awk -F, '$3 != $4' file.csv >file1
awk -F, '$3 == $4' file.csv >file2

這兩個命令都將 in 中的行file.csv視為一組逗號分隔的欄位。每當第三個欄位不等於第四個欄位時,第一個命令寫入目前行(並file1通過輸出重定向寫入)。第二個命令執行相同的操作,但邏輯相反(輸出轉到file2)。

使用單個命令稍微複雜一些,但允許您使用來自文件描述符 3 和 4 的簡單重定向在命令行上命名輸出文件:

$ awk -F, '{ fd = $3 == $4 ? 4 : 3;  print >("/dev/fd/" fd) }' file.csv 3>file1 4>file2
$ cat file1
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099
$ cat file2
1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035

或者同樣的事情,但更加模糊,

awk -F, '{ print >("/dev/fd/" 3 + ($3 == $4)) }' file.csv 3>file1 4>file2
awk -F, '{ print >($3==$4?"matchedFile":"notMatchedFile") }' infile

這是選擇性地將行重定向到兩個輸出文件之一,如果第 3列與第 4 列完全匹配(列由逗號字元分隔,由 指定-F,),則寫入*matchedFile輸出文件,否則寫入notMatchedFile*.

在此處查看其他匹配選項


$ head matchedFile notMatchedFile
==> matchedFile <==
1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035

==> notMatchedFile <==
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099

或類似但使命令更緊湊:

awk -F, '{ print >"file"($3==$4) }' infile

$ head file[01]
==> file0 <==
1311,0008,a131,a132,7039
1711,2046,a626565,a626566,7099

==> file1 <==
1311,0008,a131,a131,7039
1711,2048,a626565,a626565,7035

引用自:https://unix.stackexchange.com/questions/646614