群集线将同一列1共享为一行

时间:2012-03-14 17:25:22

标签: bash line

我有一份清单。有些行的第1列是相同的。

ENSG00000005187 chr16   19  209 0.079
ENSG00000005187 chr16   20  206 0.172

我想将那些共享同一列1的行聚类成一行,如下所示:

ENSG00000005187 chr16   19  209 0.079  chr16    20  206 0.172

我怎样才能使用bash?

THX

3 个答案:

答案 0 :(得分:2)

您可以使用awk

执行此操作
awk '{ x[$1]=x[$1] " " $2 " " $3 " " $4 " " $5 } END { for (k in x) print k,x[k]; }' input.txt

该片段假定您的所有行都有五个字段。

顺便说一下,join标准实用程序接近于你所需要的,但不幸的是它被设计为连接两个不同的文件;将文件与自身连接会产生虚假的线条。不过你可能应该检查一下,因为如果你经常做这种任务,你一定会发现它有用。

答案 1 :(得分:0)

使用此方法,您不必将整个文件存储在内存中:

sort file | awk '
  {
    if ($1 == current) {$1 = OFS; nl = ""}
    else {current = $1; if (NR>1) nl = "\n"} 
    printf("%s%s",nl,$0)
  }
  END {print ""}
'

答案 2 :(得分:0)

这可能对您有用:

sed ':a;$!N;s/^\(\S*\)\( .*\)\n\1/\1\2/;ta;P;D' file

这假定文件已排序,如果不是管道排序文件到此命令。