У меня есть набор данных, как показано ниже. Я хочу удалить строки на основе 2 условий: 1: если значения во втором столбце повторяются менее 5 раз, все строки, относящиеся к этому столбцу, должны быть удалены. 2: если значения во втором столбце повторяются более чем в 5 раз, лишнее после 5-кратного повторения следует удалить.
Вот ввод:
`
7466655 6974128 1 -0.5369 25.79
7466657 6974128 1 1.2966 80.20
7466659 6974128 1 1.5637 25.79
7466660 6974128 1 -0.3545 25.79
7466661 6974128 1 2.4080 25.79
7466663 6974128 1 3.3537 25.79
7466664 6974128 1 0.7214 37.94
7466793 6974080 1 -0.7481 26.28
7466791 6974080 1 -0.7424 26.28
7466790 6974080 1 -0.7224 26.28
8069261 7466657 1 -3.8792 25.95
8069264 7466657 1 7.3225 25.95
8069266 7466657 1 1.4466 25.95
8069365 7466009 1 3.4094 26.26
8069366 7466009 1 6.7698 26.26
8069367 7466009 1 0.0093 26.26
8069370 7466009 1 -4.9916 26.26
8069382 7466009 1 -2.7491 26.26
8069384 7466009 1 -4.0390 26.26
8089183 7466115 1 -3.0163 26.35
output:
7466655 6974128 1 -0.5369 25.79
7466657 6974128 1 1.2966 80.20
7466659 6974128 1 1.5637 25.79
7466660 6974128 1 -0.3545 25.79
7466661 6974128 1 2.4080 25.79
8069365 7466009 1 3.4094 26.26
8069366 7466009 1 6.7698 26.26
8069367 7466009 1 0.0093 26.26
8069370 7466009 1 -4.9916 26.26
8069382 7466009 1 -2.7491 26.26
Любое предложение приветствуется.
Обновлено: Добавление более универсального решения с переменной, в которой можно было бы установить ограничение проверки условия появления. Преимущество будет заключаться в том, что нам не нужно менять значения везде, просто изменить значение в переменной occur
.
awk -v occur = "5" 'FNR==NR{a[$2]++;next} a[$2]<occur{next} a[$2]>=occur{if (++b[$2]<=occur){print}}' Input_file Input_file
Не могли бы вы попробовать следующее.
awk 'FNR==NR{a[$2]++;next} a[$2]<5{next} a[$2]>=5{if (++b[$2]<=5){print}}' Input_file Input_file
Вывод будет следующим.
7466655 6974128 1 -0.5369 25.79
7466657 6974128 1 1.2966 80.20
7466659 6974128 1 1.5637 25.79
7466660 6974128 1 -0.3545 25.79
7466661 6974128 1 2.4080 25.79
8069365 7466009 1 3.4094 26.26
8069366 7466009 1 6.7698 26.26
8069367 7466009 1 0.0093 26.26
8069370 7466009 1 -4.9916 26.26
8069382 7466009 1 -2.7491 26.26
@zara, не уверен, у меня это сработало. Чтобы избежать подобных вещей, я сделал его более общим, используя переменную в своем решении EDIT, пожалуйста, проверьте его один раз и дайте мне знать.
проблема этого кода в том, что он работает только для 5 повторений. Если, например, я не хочу повторять более 3 раз, то он не дает правильного вывода, даже если я изменил 5 на 3. Почему это так?