Использование символов для правильного соответствия столбцов в Awk? - PullRequest
1 голос
/ 13 апреля 2020

У меня есть два отдельных файла, Input_File1 и Input_File2, каждый из которых содержит различное количество столбцов, которые я объединил ( с некоторой помощью ) на основе данных в нескольких столбцах.

Пока что к Input_File1 добавлен столбец для создания нового файла (file3) на основе сопоставления данных в столбцах 1, 2 и 3 в Input_File1 и столбцах 1, 2 и 3 в Input_File2. В целом, это работает хорошо. Однако есть несколько обстоятельств, когда данные в столбцах 1, 2 и 3 в Input_File1 и Input_File2 совпадают, но выходные данные в файле3 должны отличаться. Это основано на другой функции в Input_File1 и Input_File2, наличии «-» или «+».

Input_File1

VMNF01000007.1  6294425 6294650 .   .   +   Focub_B2_mimp_2
VMNF01000008.1  1441418 1441616 .   .   -   Focub_II5_mimp_3
VMNF01000008.1  1441418 1441616 .   .   -   Focub_B2_mimp_1
VMNF01000008.1  1441418 1441616 .   .   +   Focub_B2_mimp_2

Input_File2

VMNF01000007.1  6294425-6294650(+)  tacagtggggggcaataagtatgaataccctttggtgtactgacacacacctctt
VMNF01000008.1  1441418-1441616(-)  gggagtgtattgttttttctgccgctagcccattttaacatttagagtgtgcata
VMNF01000008.1  1441418-1441616(-)  gggagtgtattgttttttctgccgctagcccattttaacatttagagtgtgcata
VMNF01000008.1  1441418-1441616(+)  tacagtggggggcaataagtatgaataccctttgatgtactgacacacacctctt

Как видите, данные в двух последних строках Input_File2 одинаковы, кроме (-) и (+), как следствие, следующая последовательность отличается.

Когда создается файл3, последовательности в столбце 8 не отличаются, как в Input_File2. Это связано с тем, что при сопоставлении столбцов учитываются только данные VMNF01000008.1 1441418 1441616.

текущий файл3 (обратите внимание на последовательности и + или - последние две строки):

VMNF01000007.1  6294425 6294650 .   .   -   Focub_B2_mimp_1 tacagtggggggcaataagtatgaataccctttggtgtactgacacacacctctt
VMNF01000008.1  1441418 1441616 .   .   -   Focub_II5_mimp_3 tacagtggggggcaataagtatgaataccctttgatgtactgacacacacctctt
VMNF01000008.1  1441418 1441616 .   .   -   Focub_B2_mimp_1 tacagtggggggcaataagtatgaataccctttgatgtactgacacacacctctt
VMNF01000008.1  1441418 1441616 .   .   +   Focub_B2_mimp_2 tacagtggggggcaataagtatgaataccctttgatgtactgacacacacctctt

файл3 должен фактически выглядеть (обратите внимание на последовательности и + или - последние две строки):

VMNF01000007.1  6294425 6294650 .   .   -   Focub_B2_mimp_1 tacagtggggggcaataagtatgaataccctttggtgtactgacacacacctctt
VMNF01000008.1  1441418 1441616 .   .   -   Focub_II5_mimp_3 gggagtgtattgttttttctgccgctagcccattttaacatttagagtgtgcata
VMNF01000008.1  1441418 1441616 .   .   -   Focub_B2_mimp_1 gggagtgtattgttttttctgccgctagcccattttaacatttagagtgtgcata
VMNF01000008.1  1441418 1441616 .   .   +   Focub_B2_mimp_2 tacagtggggggcaataagtatgaataccctttgatgtactgacacacacctctt

Где, как и в Input_File2, последовательности отличаются, когда есть «-» или «+».

Таким образом, он работает во многом так же, как и предыдущий код, только с добавлением совпадения «-» или «+» в Input_File1 и Input_File2, чтобы обеспечить правильность следующей последовательности. Как я могу добавить, используя «-» или «+», чтобы определить последовательность, которая должна быть добавлена ​​в столбце 8 к предыдущему коду?

Это код, который я использую ( отсюда ):

awk '
FNR==NR{
  split($2,array,"[-(]")
  key=$1 OFS array[1] OFS array[2]
  mainarray[key]=$NF
  next
}
{ key = $1 OFS $2 OFS $3 }
(key in mainarray){
  print $0,mainarray[key]
}
'  Input_file2  Input_file1

Любой совет? Спасибо

1 Ответ

2 голосов
/ 13 апреля 2020

Не могли бы вы попробовать следующее.

awk '
FNR==NR{
  split($2,array,"[-(]")
  key=$1 OFS array[1] OFS array[2]
  ++count1[key]
  mainarray[key OFS count1[key]]=$NF
  next
}
{
  key=$1 OFS $2 OFS $3
  ++count2[key]
}
((key OFS count2[key]) in mainarray){
  print $0,mainarray[key OFS count2[key]]
}
'  Input_file2  Input_file1

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

VMNF01000007.1  6294425 6294650 .   .   +   Focub_B2_mimp_2 tacagtggggggcaataagtatgaataccctttggtgtactgacacacacctctt
VMNF01000008.1  1441418 1441616 .   .   -   Focub_II5_mimp_3 gggagtgtattgttttttctgccgctagcccattttaacatttagagtgtgcata
VMNF01000008.1  1441418 1441616 .   .   -   Focub_B2_mimp_1 gggagtgtattgttttttctgccgctagcccattttaacatttagagtgtgcata
VMNF01000008.1  1441418 1441616 .   .   +   Focub_B2_mimp_2 tacagtggggggcaataagtatgaataccctttgatgtactgacacacacctctt

Объяснение: Добавление подробного объяснения для выше.

awk '                                          ##Starting awk program from here.
FNR==NR{                                       ##Checking condition FNR==NR which will be TRUE when file2 is being read.
  split($2,array,"[-(]")                       ##Splitting 2nd field into array named array with separator -( in it.
  key=$1 OFS array[1] OFS array[2]             ##Creating variable key whose value is $1 array 1st element and array 2nd element.
  ++count1[key]                                ##Creating array count1 with index key and keep increasing its value with 1 here.
  mainarray[key OFS count1[key]]=$NF           ##Creating array mainarray with index key OFS count1[key] value and its value is last column value.
  next                                         ##next will skip all further statements from here.
}
{
  key=$1 OFS $2 OFS $3                         ##Creating variable key with value of first, second and third field values.
  ++count2[key]                                ##Creating array count2 with index key and keepincreasing value with 1 here.
}
((key OFS count2[key]) in mainarray){          ##Checking condition if key OFS count2[key] is present in mainarray
  print $0,mainarray[key OFS count2[key]]      ##Printing current line and value of mainarray whose index is key OFS and value of count2  whose index is key.
}
'  Input_file2  Input_file1                    ##Mentioning Input_file names here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...