Text-Processing
比較 csv 文件的兩列並僅顯示不匹配的記錄
我有以下格式的 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