最初のパターンと特別なパターンを比較した後、重複行を削除します

最初のパターンと特別なパターンを比較した後、重複行を削除します

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

例: ( = タブ)

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

2 番目のフィールド内の行はca削除されないという制約付きで、重複行を削除したいと思います。

結果:

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

何かアイデアはありますか? sed と sort を試しましたが、動作するコードが得られませんでした。

答え1

重複したエントリがある場合は、ca2 番目のフィールドとして必ず 1 つ存在するものと想定します。

サンプル データでは、最初のフィールドが同じ行はすべてグループ化されていますが、常にそうなるかどうかについては触れられていません。そうなる場合、タスクは少し簡単になりますが、以下の awk スクリプトは、一致する行がグループ化されていない場合でも機能します。

重複排除.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

関連情報