比較第一個模式和特殊模式後刪除重複行

比較第一個模式和特殊模式後刪除重複行

我正在尋找在比較第一個製表符分隔模式後刪除重複行的程式碼:

範例:( = 選項卡)

car ↦ ab ↦ 38/43
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
house ↦ d ↦ 2/3
house ↦ ht ↦ 3/7
boat ↦ as ↦ 5/5

我想刪除重複的行,但限制是ca不應刪除第二個欄位中的行。

結果:

car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5

有任何想法嗎?我嘗試了 sed 和 sort,但沒有得到任何工作代碼。

答案1

我假設如果有重複的條目,總會有一個ca作為第二個欄位。

在您的範例資料中,具有相同第一個欄位的所有行都分組在一起,但您沒有提到是否總是如此。如果是,那麼任務會稍微簡單一些,但是即使匹配的行沒有組合在一起,下面的 awk 腳本也可以工作。

去重文件

#!/usr/bin/awk -f

{
    if (!($1 in lines) || ($2 == "ca"))
        lines[$1] = $0
}

END{
    for (i in lines) 
        print lines[i]
}

如果輸入檔案被稱為data,您將像這樣運行它:

awk -f dedup.awk data

或者

awk -F '\t' -f dedup.awk data

確保它使用製表符作為字段分隔符號;預設欄位分隔符號是一個或多個空格和/或製表符。請Fields參閱 gawk 手冊頁以獲取更多資訊。

由於 awk 數組的工作方式,輸出資料的順序可能與來源資料不同。可以使用稍微複雜的程式保留原始順序,或者可以使用 awk 的排序函數之一對輸出進行排序,但使用 bash sort 命令可能更靈活。

如果需要,可以壓縮該 awk 腳本:

awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data

相關內容