如何根据Linux第二栏中的重复值删除一些行?

时间:2019-04-09 15:07:27

标签: awk cut

我有一个如下的数据集。我想根据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

任何建议都值得赞赏。

1 个答案:

答案 0 :(得分:4)

EDIT: :添加一个带有变量的通用解决方案,该变量可以设置发生条件检查的极限。优势在于我们无需在任何地方更改值,只需更改变量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