最初のパターンと特殊パターンを比較した後に重複行を削除する

最初のパターンと特殊パターンを比較した後に重複行を削除する

最初のタブで区切られたパターンを比較した後、重複した行を削除するコードを探しています。

例:(=タブ)

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

重複行を削除したいが、ca2番目のフィールドの行を削除しないでくださいという制限があります。

結果:

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

どんなアイデアがありますか? sedとsortを試しましたが、動作するコードを取得できませんでした。

答え1

重複したエントリがある場合は、常にca2番目のフィールドとして1つあるとします。

サンプルデータでは、最初のフィールドが同じすべての行が一緒にグループ化されていますが、これが常に該当するかどうかは言及していません。その場合、操作は少し簡単ですが、一致する行が一緒にグループ化されていなくても、次の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

タブがフィールド区切り文字として使用されていることを確認してください。デフォルトのフィールド区切り文字は、1つ以上のスペースおよび/またはタブです。Fields詳細については、gawkのマニュアルページを参照してください。

awk配列の動作方法により、出力データの順序はソースデータの順序と異なる場合があります。少し複雑なプログラムを使用して元の順序を維持したり、awkのソート機能の1つを使用して出力をソートしたりできますが、bash sortコマンドを使用する方が柔軟です。

必要に応じてawkスクリプトを圧縮できます。

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

関連情報