![读取和丢弃行](https://linux22.com/image/13749/%E8%AF%BB%E5%8F%96%E5%92%8C%E4%B8%A2%E5%BC%83%E8%A1%8C.png)
我有一个关于我必须解决的问题的问题,我的台词是这样的:
输入
GTEX-1117F-0003-SM-58Q7G
GTEX-1117F-0003-SM-5DWSB
GTEX-111CU-0826-SM-5EGIJ
GTEX-111CU-0926-SM-5EGIK
GTEX-ZZPU-2726-SM-5NQ8O
GTEX-ZZPU-2626-SM-5E45Y
K-562-SM-2AXVE
K-562-SM-26GMQ
我有另一个文件告诉我第一个字母是“患者”(例如GTEX-1117F
、GTEX-111CU
、GTEX-ZZPU
和K-562
)。
我需要一个唯一的代码才能知道哪个患者拥有最多的样本?
因此,我需要知道“患者”有多少个样本GTEX-1117F
,在本例中我有 2 个。
需要输出
GTEX-1117F 2
GTEX-111CU 2
GTEX-ZZPU 2
K-562 2
然后我需要通过更多样本了解“患者”(例如K-562 140
)。
答案1
您可以用来cut
提取每行上的前两个破折号分隔的字段,对其结果进行排序,并计算每个唯一字符串出现的次数:
$ cut -d '-' -f 1,2 file | sort | uniq -c | sort -n | head
2 GTEX-1117F
2 GTEX-111CU
2 GTEX-ZZPU
2 K-562
这还会传递数据以sort -n
对数字进行排序并用于head
获取最佳结果。
答案2
仅调用 awk 并避免排序延迟,您可以使用:
awk -F- '{c[$1"-"$2]++}END{for (i in c){print i,c[i]}}' file
答案3
我将给出一个不同的示例,以便计数更明显:
GTEX-1117F-0003-SM-58Q7G
GTEX-1117F-0003-SM-58Q7G
GTEX-1117F-0003-SM-5DWSB
GTEX-111CU-0826-SM-5EGIJ
GTEX-111CU-0926-SM-5EGIK
GTEX-ZZPU-2726-SM-5NQ8O
GTEX-ZZPU-2626-SM-5E45Y
K-562-SM-2AXVE
该命令假设患者 ID 的格式为string-string
:
$ cut -d'-' -f1,2 file | uniq -c | awk -F' ' '{ print $2,$1}' | sort -rk2 | head -1
GTEX-1117F 3
答案4
从以下开始怎么样
$ for F in `cat patients`; do echo -n "$F " ; grep "^$F" records | wc -l; done
GTEX-1117F 2
GTEX-111CU 2
GTEX-ZZPU 2
K-562 2
$