
最初のタブ区切りパターンを比較した後、重複行を削除するコードを探しています:
例: ( ↦
= タブ)
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
重複したエントリがある場合は、ca
2 番目のフィールドとして必ず 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