读取和丢弃行

读取和丢弃行

我有一个关于我必须解决的问题的问题,我的台词是这样的:

输入

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-1117FGTEX-111CUGTEX-ZZPUK-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
$

相关内容