嗨,我需要在下面的示例中执行此操作:
输入文件:
chr17 41246351 41246352 NM_007294_Exon_10
chr17 41246351 41246352 NM_007297_Exon_9
chr17 41246351 41246352 NM_007300_Exon_10
chr17 41246351 41246352 NR_027676_Exon_10
chr17 41246352 41246353 NM_007294_Exon_10
chr17 41246352 41246353 NM_007297_Exon_9
chr17 41246352 41246353 NM_007300_Exon_10
获得如下输出:
chr17 41246351 41246352 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10,NR_027676_Exon_10
chr17 41246352 41246353 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10
我尝试使用uniq
和sort
,但没有成功。谢谢你的帮助。
答案 0 :(得分:2)
您可以使用此awk
:
awk '{i=$1 FS $2 FS $3} {a[i]=!a[i]?$4:a[i] FS $4} END {for (l in a) {print l,a[l]}}' file
如果您希望最后一列以逗号分隔,
awk '{i=$1 FS $2 FS $3} {a[i]=!a[i]?$4:a[i] "," $4} END {for (l in a) {print l,a[l]}}' file
答案 1 :(得分:1)
$ perl -ne '($k,$v)=/^(.*\s)(\S+)$/; $h{$k} .= "$v,";
END{print "$_$h{$_}\n" foreach keys %h }' ip.txt
chr17 41246351 41246352 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10,NR_027676_Exon_10,
chr17 41246352 41246353 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10,
这会留下尾随,
,但可以使用sed 's/,$//'
或者使用?:
条件来根据需要添加逗号(类似于@sat在awk解决方案中使用的逻辑),不需要后期处理来删除尾随,
$ perl -ne '($k,$v)=/^(.*\s)(\S+)$/; $h{$k} .= $h{$k}?",$v":"$v";
END{print "$_$h{$_}\n" foreach keys %h }' ip.txt
答案 2 :(得分:0)
尝试使用awk:
awk '!seen[$2]++' testfile
希望这有帮助!