Как напечатать поля для повторного ключевого столбца в одну строку - PullRequest
2 голосов
/ 16 ноября 2011

Я хотел бы преобразовать таблицу таким образом, чтобы для дублированного значения в столбце № 2 будут иметь соответствующие значения из столбца № 1.

т.е. что-то в этом роде ...

MZ00024296  AC148152.3_FG005

MZ00047079  AC148152.3_FG006

MZ00028122  AC148152.3_FG008

MZ00032922  AC148152.3_FG008

MZ00048218  AC148152.3_FG008

MZ00024680  AC148167.6_FG001

MZ00013456  AC149475.2_FG003

до

AC148152.3_FG005    MZ00024296

AC148152.3_FG006    MZ00047079

AC148152.3_FG008    MZ00028122|MZ00032922|MZ00048218

AC148167.6_FG001 MZ00024680

AC149475.2_FG003 MZ00013456

Как мне нужно для вычислений в R, я попытался использовать:

x=aggregate(mz_grmz,by=list(mz_grmz[,2]),FUN=paste(mz_grmz[,1],sep="|"))

но это не работает (неправильная функция) Ошибка в match.fun (FUN): 'paste (mz_grmz [, 1], sep = "|") "не является функцией, символом или символом

Я также напоминаю себе о функции unstack (), но это не то, что мне нужно.

Я пытался сделать это с помощью awk, основываясь на своих базовых знаниях, я переработал приведенный здесь код:

site1

#! /bin/sh
for y do
awk -v FS="\t" '{
for (x=1;x<=NR;x++) {
    if (NR>2 && x=x+1) {
    print $2"\t"x
    }
    else {print NR}
}
}' $y > $y.2
done

к сожалению, он не работает, он создает только огромный файл с полем # 2 и некоторыми числами.

Полагаю, это простая задача, но сейчас она выше моих навыков. Может ли кто-нибудь дать мне подсказку? Может быть, просто использовать функцию в совокупности в R.

Спасибо

Ответы [ 3 ]

1 голос
/ 16 ноября 2011

Вы можете сделать это в awk следующим образом:

awk '
    {
        if ($2 in a)
            a[$2] = a[$2] "|" $1
        else
            a[$2] = $1
    }
    END {
        for (i in a)
            print i, a[i]
    }' INFILE > OUTFILE
0 голосов
/ 17 ноября 2011

Это решение GNU sed может работать для вас:

 sed -r '1{h;d};H;${x;s/(\S+)\s+(\S+)/\2\t\1/g;:a;s/(\S+\t)([^\n]*)(\n+)\1([^\n]*)\n*/\1\2|\4\3/;ta;p};d' input_file

Объяснение: Используйте опцию расширенного регулярного выражения -r, чтобы сделать регулярное выражение более читабельным.Прочитайте весь файл в поле для хранения (HS).Затем, в конце файла, переключитесь на HS и сначала поменяйте местами отдельные поля.Затем сравните первые поля в соседних строках и, если они совпадают, пометьте второе поле из второй записи первой строкой, разделенной |.Повторяется до тех пор, пока в последующих соседних строках не появятся повторяющиеся первые поля, затем распечатайте файл.

0 голосов
/ 16 ноября 2011

, чтобы вывод соответствовал тексту вашего вопроса (пустые строки и т. Д.):

awk '{if($0 &&($2 in a))a[$2]=a[$2]"|"$1;else if ($0) a[$2]=$1;}\
END{for(x in a){print x,a[x];print ""}}' inputFile

test :

kent$  echo "MZ00024296  AC148152.3_FG005

MZ00047079  AC148152.3_FG006

MZ00028122  AC148152.3_FG008

MZ00032922  AC148152.3_FG008

MZ00048218  AC148152.3_FG008

MZ00024680  AC148167.6_FG001

MZ00013456  AC149475.2_FG003"|awk '{if($0 &&($2 in a))a[$2]=a[$2]"|"$1;else if ($0) a[$2]=$1;}END{for(x in a){print x,a[x];print ""}}'
AC149475.2_FG003 MZ00013456

AC148152.3_FG005 MZ00024296

AC148152.3_FG006 MZ00047079

AC148152.3_FG008 MZ00028122|MZ00032922|MZ00048218

AC148167.6_FG001 MZ00024680
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...