我需要计算出某个特定字符串在第 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