AWK сортирует массив, разбивая строку в определенном столбце, чтобы соответствовать другому массиву в bash - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть массив a, который следующие строки

rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660
rs6605071   chr1:962943 C   84069   NM_001160184.1
rs6605071   chr1:962943 C   339451  NC_006462594.2
rs6605071   chr1:962943 C   339451  XR_001737138.1
rs6605071   chr1:962943 C   339451  XM_006710600.3

и другой упорядоченный массив b, который имеет следующие строки:

NC
NG
NM
NP
NR
XM
XP
XR
WP

Я хотел бы заказатьстроки в массиве a, соответствующие порядку массива b в столбце 5 для получения желаемого результата:

rs6605071   chr1:962943 C   339451  NC_006462594.2
rs6605071   chr1:962943 C   84069   NM_001160184.1
rs6605071   chr1:962943 C   339451  XM_006710600.3
rs6605071   chr1:962943 C   339451  XR_001737138.1
rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660

Я попытался выполнить следующую команду, разделив столбец 5, но он печатаетпустые строки:

awk -F '\t' -v OFS='\t' 'FNR==NR{split(a[$5],t,"_"); t[1]=$0;next}
{print a[$1]}' <(printf '%s\n' "${a[@]}") <(printf '%s\n' "${b[@]}")

Подскажите, пожалуйста, почему моя команда не работает?Будет ли работать частичное совпадение с помощью регулярного выражения?

EDIT 1 : изменение массива a для включения строк, которые могут иметь несколько кодов из массива b

rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660
rs6605071   chr1:962943 C   84069   NM_001160184.1
rs6605071   chr1:962943 C   339451  NC_006462594.2
rs6605071   chr1:962943 C   ENSG00000135234 ENST00000624144
rs6605071   chr1:962943 C   339451  XR_001737138.1
rs6605071   chr1:962943 C   334324  NC_006462632.2
rs6605071   chr1:962943 C   84333   NM_004353462.1
rs6605071   chr1:962943 C   339451  XM_006710600.3

Ожидаемый результат:

rs6605071   chr1:962943 C   334324  NC_006462632.2
rs6605071   chr1:962943 C   339451  NC_006462594.2
rs6605071   chr1:962943 C   84069   NM_001160184.1
rs6605071   chr1:962943 C   84333   NM_004353462.1
rs6605071   chr1:962943 C   339451  XM_006710600.3
rs6605071   chr1:962943 C   339451  XR_001737138.1
rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660
rs6605071   chr1:962943 C   ENSG00000135234 ENST00000624144

РЕДАКТИРОВАТЬ 2 : Поскольку ответ, предоставленный RavinderSingh13 ниже, не полностью отвечает на мой вопрос, я повторно задам вопрос о том, как выполнить такое задание с помощью AWK.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Здесь я предполагаю, что вы хотите напечатать совпадающие поля обоих массивов по порядку, а затем оставшиеся несопоставленные элементы из массива а также вы хотите напечатать тоже, если это так, тогда вам может помочь следующее.

Создание массивов здесь:

declare -a a=("rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660
rs6605071   chr1:962943 C   84069   NM_001160184.1
rs6605071   chr1:962943 C   339451  NC_006462594.2
rs6605071   chr1:962943 C   339451  XR_001737138.1
rs6605071   chr1:962943 C   339451  XM_006710600.3")
declare -a b=("NC
NG
NM
NP
NR
XM
XP
XR
WP")

Теперь выполняется следующий код:

awk -v OFS='\t' '
FNR==NR{
  split($5,a,"_")
  array[a[1]]=$0
  next
}
($1 in array) {
  print array[$0]
  b[$1]
}
END{
  for(i in b){
    delete array[i]
  }
  for(j in array){
    print array[j]
  }
}' <(printf '%s\n' "${a[@]}") <(printf '%s\n' "${b[@]}")

Вывод будет следующим.

rs6605071   chr1:962943 C   339451  NC_006462594.2
rs6605071   chr1:962943 C   84069   NM_001160184.1
rs6605071   chr1:962943 C   339451  XM_006710600.3
rs6605071   chr1:962943 C   339451  XR_001737138.1
rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...