我有一份清单。有些行的第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
答案 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
这假定文件已排序,如果不是管道排序文件到此命令。