我是 bash 腳本的新手,需要以下問題的幫助。我決議了一個日志檔案以獲取以下內容,現在停留在后面的部分。我有一個 file1.csv 內容為:
mac-test-1,10.32.9.12,15
mac-test-2,10.32.9.13,10
mac-test-3,10.32.9.14,11
mac-test-4,10.32.9.15,13
第二個 file2.csv 具有以下內容:
mac-test-3,10.32.9.14
mac-test-4,10.32.9.15
我想做一個檔案比較,如果第二個檔案中的行與第一個檔案中的任何行匹配,則更改檔案 1 的內容,如下所示:
mac-test-1,10.32.9.12, 15, no match
mac-test-2,10.32.9.13, 10, no match
mac-test-3,10.32.9.14, 11, matched
mac-test-4,10.32.9.15, 13, matched
我試過這個
awk -F "," 'NR==FNR{a[$1]; next} $1 in a {print $0",""matched"}' file2.csv file1.csv
但它在下面列印并且不包括不匹配的記錄
mac-test-3,10.32.9.14,11,matched
mac-test-4,10.32.9.15,13,matched
此外,在某些情況下,file2 可以為空,因此結果應如下所示:
mac-test-1,10.32.9.12,15, no match
mac-test-2,10.32.9.13,10, no match
mac-test-3,10.32.9.14,11, no match
mac-test-4,10.32.9.15,13, no match
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk代碼。您不需要先檢查條件然后列印陳述句,因為當您檢查時,$1 in a那些不存在的專案將永遠不會進入此條件的塊中。因此,最好列印整行,file1.csv然后根據它們在陣列中的存在情況列印該特定行的匹配或不匹配狀態。
awk '
BEGIN { FS=OFS="," }
FNR==NR{
arr[$0]
next
}
{
print $0,(($1 OFS $2) in arr)?"Matched":"Not-matched"
}
' file2.csv file1.csv
編輯:添加一個解決方案來處理 file2.csv 場景的空檔案,與上面相同的概念,只有當 file2.csv 是空檔案時它處理場景。
awk -v lines=$(wc -l < file2.csv) '
BEGIN { FS=OFS=","}
(lines==0){
print $0,"Not-Matched"
next
}
FNR==NR{
arr[$0]
next
}
{
print $0,(($1 OFS $2) in arr)?"Matched":"Not-matched"
}
' file2.csv file1.csv
uj5u.com熱心網友回復:
您沒有列印 else 案例:
awk -F "," 'NR==FNR{a[$1]; next}
{
if ($1 in a) {
print $0 ",matched"
} else {
print $0 ",no match"
}
}' file2.csv file1.csv
輸出
mac-test-1,10.32.9.12,15,no match
mac-test-2,10.32.9.13,10,no match
mac-test-3,10.32.9.14,11,matched
mac-test-4,10.32.9.15,13,matched
或者簡而言之,無需手動列印逗號而是使用 OFS:
awk 'BEGIN{FS=OFS=","} NR==FNR{a[$1];next}{ print $0 OFS (($1 in a)?"":"no")"match"}' file2.csv file1.csv
編輯
我在此頁面上找到了一個解決方案,在空檔案上處理 FNR==NR。
當 file2.csv 為空時,所有輸出行將是:
mac-test-1,10.32.9.12,15,no match
例子
awk -F "," '
ARGV[1] == FILENAME{a[$1];next}
{
if ($1 in a) {
print $0 ",matched"
} else {
print $0 ",no match"
}
}' file2.csv file1.csv
uj5u.com熱心網友回復:
@RavinderSingh13 和 @Thefourthbird 的每個答案都包含解決方案的大部分內容,但在這里它們都在一起:
awk '
BEGIN { FS=OFS="," }
{ key = $1 FS $2 }
FILENAME == ARGV[1] {
arr[key]
next
}
{
print $0, ( key in arr ? "matched" : "no match")
}
' file2.csv file1.csv
或者,如果您愿意:
awk '
BEGIN { FS=OFS="," }
{ key = $1 FS $2 }
!f {
arr[key]
next
}
{
print $0, ( key in arr ? "matched" : "no match")
}
' file2.csv f=1 file1.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512832.html
標籤:linux壳awk
上一篇:gitpre-commit錯誤:檢查檔案名:.git/hooks/pre-commit;第25行;語法錯誤:檔案意外結束
下一篇:如何在字串中間增加一個數字
