Кластерные линии, разделяющие один и тот же столбец 1 на одну строку - PullRequest
1 голос
/ 14 марта 2012

У меня есть список. Есть несколько строк, столбец 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?

ТНХ

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Вы можете сделать это, используя awk:

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

Этот фрагмент предполагает, что все ваши строки имеют ровно пять полей.

Кстати, стандартная утилита join приближается кделать то, что вам нужно, но, к сожалению, предназначен для объединения двух разных файлов;объединение файла с самим собой приводит к появлению ложных строк.Тем не менее, вам, вероятно, стоит проверить это, потому что, если вы часто выполняете такую ​​задачу, вы обязательно найдете ее полезной в какое-то время.

0 голосов
/ 14 марта 2012

Это может работать для вас:

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

Предполагается, что файл отсортирован, если не просто передать отсортированный файл по этой команде.

0 голосов
/ 14 марта 2012

При использовании этого метода вам не нужно хранить весь файл в памяти:

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