Вывести строку с соответствием и строку выше, соответствующую другому шаблону - PullRequest
0 голосов
/ 30 января 2020

У меня есть файл с определенными идентификаторами.

ID.txt
aaa
bbb
ccc

У меня есть другой файл, подобный этому File.txt

Query: ABC1
aaa
abc
bbb
ccc
Query: CAB1
bbb
ccc
abc
Query: CBB1
ass
aaa
bbc

**Expected output:**
Query: ABC1
aaa
bbb
ccc
Query: CAB1
bbb
ccc
Query: CBB1
aaa

Реальный пример:

**IDs**
    LYSC_CHICK
    LACB_BOVIN
    B5B0D4_BOVIN
    DEF1_ARAHY
    DEF2_ARAHY
    DEF3_ARAHY
    TRFL_BOVIN
    Q0PKR4_ARAHY
    Q0GM57_ARAHY
    Q647G5_ARAHY
    Q6JYQ7_HEVBR
    AMP2_FAGES

**File**
    Query: PROKKA_00022 hypothetical protein - 36 aa
    Hit: AMP1_FAGES UniProt Fag e 4 UniProt P0DKH7 http://www.u
     100.0% identity
    Hit: AMP2_FAGES UniProt Fag e 4 UniProt P0DKH8 http://www.u
     100.0% identity
    Hit: O49860_HEVBR UniProt Hev b 6 UniProt O49860 http://www
     100.0% identity
    Hit: Q6JYQ7_HEVBR UniProt Hev b 6 UniProt Q6JYQ7 http://www
     100.0% identity
    Hit: HEVE_HEVBR UniProt Hev b 6 UniProt P02877 http://www.u
    Query: PROKKA_00572 hypothetical protein - 36 aa
    Hit: AMP1_FAGES UniProt Fag e 4 UniProt P0DKH7 http://www.u
     100.0% identity
    Hit: AMP2_FAGES UniProt Fag e 4 UniProt P0DKH8 http://www.u
     100.0% identity
    Hit: O49860_HEVBR UniProt Hev b 6 UniProt O49860 http://www
     100.0% identity
    Hit: Q6JYQ7_HEVBR UniProt Hev b 6 UniProt Q6JYQ7 http://www
     100.0% identity
    Query: PROKKA_01572 hypothetical protein - 36 aa
    Hit: AMP1_FHYES UniProt Fag e 4 UniProt P0DKH7 http://www.u
     100.0% identity
    Hit: AMX5_FAGES UniProt Fag e 4 UniProt P0DKH8 http://www.u
     100.0% identity
    Hit: O87860_HLLBR UniProt Hev b 6 UniProt O49860 http://www
     100.0% identity
    Hit: JHYYQ7_HEVBR UniProt Hev b 6 UniProt Q6JYQ7 http://www
     100.0% identity

**Expected output:**

    Query: PROKKA_00022 hypothetical protein - 36 aa
    Hit: Q6JYQ7_HEVBR UniProt Hev b 6 UniProt Q6JYQ7 http://www
    Hit: AMP2_FAGES UniProt Fag e 4 UniProt P0DKH8 http://www.u
    Query: PROKKA_00572 hypothetical protein - 36 aa
    Hit: Q6JYQ7_HEVBR UniProt Hev b 6 UniProt Q6JYQ7 http://www
    Hit: AMP2_FAGES UniProt Fag e 4 UniProt P0DKH8 http://www.u

Мне нужно сделать это в al oop? Я пробовал что-то вроде этого, но не очень удачно:

for i in `cat ID.txt`
do 
   awk '/Query/{bar=$2} /"$i"/{print bar}' File.txt > output.txt
done

(Исходное сообщение обновлено, чтобы отразить ожидаемый реальный результат). Большое спасибо за помощь. Обновлено 02-01-2020, чтобы включить дополнительную информацию для идентификаторов и файлов и ожидаемых выходных файлов)

Ответы [ 2 ]

2 голосов
/ 30 января 2020

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

awk '
FNR==NR{
  a[$1]
  next
}
/^Query/ || $0 in a
' id.txt file.txt

Вывод выглядит следующим образом.

Query: ABC1
aaa
bbb
ccc
Query: CAB1
bbb
ccc
Query: CBB1
aaa
0 голосов
/ 01 февраля 2020

Для тех, кто заинтересован, у @ RavinderSingh13 был правильный ответ, с незначительной модификацией, заявленной @EdMorton для реального примера:

awk '
FNR==NR{
  a[$1]
  next
}
/^Query/ || $2 in a
' IDs File

Выход на другом имел список строк «Запрос» у которого не было соответствующих идентификаторов, как требуется. Итак, я использовал следующее, чтобы избавиться от дополнительных строк:

 awk '
    FNR==NR{
      a[$1]
      next
    }
    /^Query/ || $2 in a
    ' IDs File | grep -B 1 'Hit: ' | grep -v '^--' > output_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...