特定列中不同字符串的列出频率

特定列中不同字符串的列出频率

我需要计算出某个特定字符串在第 4 列中出现了多少次。

这是我的数据:

25 48656721 48656734 FAM132B ENSCAFT00000019683 4 0.51 
X 53969937 53969950 FAM155B ENSCAFT00000026508 5 0.57 
3 42203721 42203906 FAM169B ENSCAFT00000017307 5 0.54 
36 28947780 28947831 FAM171B ENSCAFT00000046981 5 0.51 
10 45080519 45080773 FAM171B ENSCAFT00000003744 9 -0.53 
3 61627122 61627446 FAM193A ENSCAFT00000023571 13 0.64 
3 61626373 61626466 FAM193A ENSCAFT00000023571 6 0.51 
15 55348822 55349196 FAM193A ENSCAFT00000045012 5 0.52 

这是我的数据的一部分。所以,我希望输出是:

1 FAM132B
1 FAM155B
1 FAM169B
2 FAM171B
3 FAM193A

依此类推 - 对于我的其余数据。什么是有效的命令?

答案1

一种简单的解决方案是使用awk拉动第 4 列;uniq -c数一下它们;另一个sort按第二列(旧的第 4 列数据)对它们进行排序:

awk '{print $4}' < data | uniq -c | sort -k2

在您的(更新的)示例输入中,这将提供:

  1 FAM132B
  1 FAM155B
  1 FAM169B
  2 FAM171B
  3 FAM193A

答案2

使用awk

awk '{a[$4]++} END{for(s in a){print a[s]" "s}}' file
  • a[$4]++递增索引具有第四列名称的数组元素。当完成文件时,该数组包含第四列所有出现的计数器。
  • END{}: 表示 awk 通过文件时运行的代码块。
    • for(s in a)穿过数组...
    • print a[s]" "s}...并打印其值和索引。

输出:

1 FAM169B
3 FAM193A
1 FAM132B
1 FAM155B
2 FAM171B

答案3

假设分隔符是单个空格:

cut -d' ' -f4 infile | sort | uniq -c

注意uniq过滤器邻近的匹配行,因此您需要sort首先使用以下输入:

FAM193A
FAM155B
FAM169B
FAM171B
FAM132B
FAM193A
FAM132A
FAM132B
FAM155B
FAM169B
FAM171B
FAM171A
FAM193A
FAM132A

使用sort | uniq -c产生:

  2 FAM132A
  2 FAM132B
  2 FAM155B
  2 FAM169B
  1 FAM171A
  2 FAM171B
  3 FAM193A

同时uniq -c | sort -k2产生:

  1 FAM132A
  1 FAM132A
  1 FAM132B
  1 FAM132B
  1 FAM155B
  1 FAM155B
  1 FAM169B
  1 FAM169B
  1 FAM171A
  1 FAM171B
  1 FAM171B
  1 FAM193A
  1 FAM193A
  1 FAM193A

相关内容