检查重复列并在bash中打印另一列

时间:2016-08-31 13:23:19

标签: bash awk duplicates

嗨,我需要在下面的示例中执行此操作:

输入文件:

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

我尝试使用uniqsort,但没有成功。谢谢你的帮助。

3 个答案:

答案 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

希望这有帮助!

相关问题