Как мне номер строки набора столбцов с учетом значений строк первого столбца (оболочка UNIX) - PullRequest
0 голосов
/ 28 августа 2018

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

rs758613821  574290     insertion_inframe   P   285  AAAP
rs758613821  574290     insertion_inframe   P   285  APAA
rs758613821  574290     insertion_inframe   P   285  APLA
rs1367252071 574290     deletion_inframe    CADDL   134  F
rs538        3246       frameshift_variant  F   97  FGLYP
rs538        3246       frameshift_variant  F   97  PYFLG

И вывод должен быть

1 rs758613821    574290     insertion_inframe   P   285  AAAP
1 rs758613821    574290     insertion_inframe   P   285  APAA
2 rs758613821    574290     insertion_inframe   P   285  APLA
3 rs1367252071   574290     deletion_inframe    CADDL   134  F
4 rs538          3246       frameshift_variant  F   97  FGLYP
4 rs538          3246       frameshift_variant  F   97  PYFLG

и так далее ...

Таким образом, я выполнил код следующим образом

awk 'BEGIN {FS=OFS="\t"} function intern(sym) { if (sym in table)
                          return table[sym]
                        return table[sym] = ++counter }
 { print intern($1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6), $0 }' "input" > "output";

Тем не менее, я не решил проблему, связанную с последним столбцом, чтобы присвоить тот же номер, если одинаковые буквы и длина, хотя и в другом порядке. Возможно ли это сделать в среде UNIX? Я думаю, может быть, с помощью функции substr или подобного, но я не уверен, что будет правильным кодом. Заранее спасибо за поддержку и помощь!

1 Ответ

0 голосов
/ 28 августа 2018

Не уверен, что это то, что вы хотите сделать, но попробуйте

$ awk 'function canon(f) {n=split(f,a,""); 
                          asort(a); c=""; 
                          for(i=1;i<=n;i++) c=c a[i]; 
                          return c;}
                         {key=canon($NF)} 
          !(key in keys) {keys[key]=++ctr} 
                         {print keys[key],$0}' file

1 rs758613821  574290     insertion_inframe   P   285  AAAP
1 rs758613821  574290     insertion_inframe   P   285  APAA
2 rs758613821  574290     insertion_inframe   P   285  APLA
3 rs1367252071 574290     deletion_inframe    CADDL   134  F
4 rs538        3246       frameshift_variant  F   97  FGLYP
4 rs538        3246       frameshift_variant  F   97  PYFLG

преобразовать последнее поле в каноническую форму и сосчитать уникальные экземпляры.

Чтобы использовать полную запись в качестве ключа, сделайте это вместо

                 ...
                 {line=$0;
                  $NF=canon($NF);
                  key=$0} 
  !(key in keys) {keys[key]=++ctr} 
                 {print keys[key],line}' file

скопировать строку, заменить последнее поле канонической формой, использовать обновленную строку в качестве ключа, подсчитать количество уникальных экземпляров, количество отпечатков и исходную строку

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