计算列中的出现次数并获取整行

时间:2016-11-28 04:04:30

标签: linux bash awk grep

Trio type1 Chr Pos Allele rsID Gene
Sample11 type1 1 11105106 C/T rs2273345 MASP2
Sample11 type1 1 31342388 A/C/* 1:31342388 SDC3
Sample11 type1 1 33402334 GA/G-/++A rs36040674 RNF19B
Sample11 type1 1 38078171 G/+GT/+GTGT rs139353088 RSPO1
Sample11 type1 1 47074774 TCATGGTCTGATGGTCC/T----------------/ACATGGTCTGATGGTCC rs4275405 MOB3C
Sample11 type1 1 50883804 CTT/C--/CT- 1:50883804 DMRTA2
Sample11 type1 1 52947350 TA/++A/T- 1:52947350 ZCCHC11
Sample11 type1 1 84956161 CT/C-/++T rs556742567 RPF1
Sample11 type1 1 114940632 CAA/C--/CA- rs78184484 TRIM33

我知道如何计算列rsID的出现次数。 这是我从@glenn jackman学到的命令,我可以得到每个rsID的计数。

awk '{count[$7]++} END {for (word in count) print word, count[word]}' Nofilter.txt

我想grep整个rsID重复出现的行。

grep if count[word]>3 

如何根据当前命令修改命令?

3 个答案:

答案 0 :(得分:2)

假设:

  • 您正在使用gawk和
  • 无序输出正常,
  • 您的输入名为data.txt

解决方案:

  • 自gawk 4.0.0:

    awk '{a[$7]++;b[$7][c++]=$0}END{for(x in a)if(a[x]>3)for(y in b[x])print(b[x][y])}' data.txt
    
  • 在gawk 4.0.0之前:

    awk '($7 in a){b[$7]=ORS}{c[$7]++;a[$7]=a[$7] b[$7] $0}END{for(x in c)if(c[x]>2)print(a[x])}' data.txt
    

答案 1 :(得分:0)

为什么不将它管道传输到onClick以检查事件是否大于3?

awk

这将检查输出并告诉您哪些行出现在您选择的截止值之上。

答案 2 :(得分:0)

如果您的awk不支持多维数组,则可以尝试使用

$ awk '{k=$7; c[k]++; a[k]=(k in a)?a[k] ORS $0:$0} 
    END{for(k in c) if(c[k]>3) print a[k]}' file

<强>解释

  

k=$7将密钥设置为字段7
  密钥的c[k]++递增计数器   a[k]=(k in a)?a[k] ORS $0:$0追加带记录分隔符的行   介于(加入)之间,第一次特别关注!(k in a),自此以后   a[k]=a[k] ORS $0将从额外的记录分隔符开始   END{...完成后,打印所有令人满意的条件。