
我正在尋找在比較第一個製表符分隔模式後刪除重複行的程式碼:
範例:( ↦
= 選項卡)
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