最初のタブで区切られたパターンを比較した後、重複した行を削除するコードを探しています。
例:(↦
=タブ)
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
2番目のフィールドの行を削除しないでくださいという制限があります。
結果:
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5
どんなアイデアがありますか? sedとsortを試しましたが、動作するコードを取得できませんでした。
答え1
重複したエントリがある場合は、常にca
2番目のフィールドとして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