Как добавить новый номер для каждого элемента в определенном столбце, используя Linux - PullRequest
0 голосов
/ 18 мая 2018

У меня есть огромный текстовый файл, подобный этому:

Chr1  11000   11500   geneA  0
Chr1  11500   12000   geneA  6
Chr1  12000   12500   geneA  0
Chr1  12500   13000   geneA  7
...
Chr30  120000   125000   geneZ  7
Chr30  125000   130000   geneZ  7

Мне нужно индивидуально пронумеровать каждый экземпляр имени гена (столбец 4.) Так, например, оно станет следующим:

Chr1  11000   11500   geneA_1  0
Chr1  11500   12000   geneA_2  6
Chr1  12000   12500   geneA_3  0
Chr1  12500   13000   geneA_4  7
...
Chr30  12500   13000   geneZ_939  7
Chr30  12500   13000   geneZ_940  7

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Просто используйте приведенную ниже команду:

awk 'BEGIN {i=1;} {print $1" "$2" "$3" "$4"_"i" "$5; i++;}' filename > tmpfile
mv tmpfile filename

используйте вкладки вместо пробелов в соответствии с вашим файлом или необходимостью.

0 голосов
/ 18 мая 2018

Основная идея, глядя на столбец 4, заключается в том, что вы используете данные столбца в качестве индекса для associative array / hash счетчиков:

awk '{i[$4]++; print $4 "_" i[$4]}' gene

И для сохранения других данных ...:

awk '{i[$4]++; c4 = $4 "_" i[$4]; gsub($4, c4);print;}' #and optionally >outFile 

Если вы не готовы переписать файл на месте, я не думаю, что стандартный awk поддерживает это:

perl -i~ -ape 'if (!($F[3] =~ /_\d+$/)) { $i{$F[3]}++; $c4 = "$F[3]_$i{$F[3]}"; s/$F[3]/\Q$c4/}' gene

Это обрабатывает gene и создаетgene~ файл резервной копии.Perl также не будет обрабатывать один и тот же файл дважды (если он видит _ и число в конце столбца 4, пропускает строку)

Предупреждение: если имя вашего гена существует в строках 1-3, ваш вывод будет сломан.Тем не менее, на основании ваших данных выборки выглядит маловероятным.

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