grep между двумя файлами и сохраненной пустой строкой в ​​файле 1

У меня проблема с grep.

У меня есть файл с именем Uniprot_interactors.txt, содержащий список кодов (например, GRT986E), и иногда между объектами есть одна или несколько пустых строк.

В некоторых других случаях у меня есть объект, состоящий из 2 частей, разделенных низким тире (например, TRY546 _ TRE578), и эти строки следует рассматривать как пустые.

После этого у меня есть еще один файл Good_interactors.txt, содержащий список кодов и для каждого связана переменная (например, aaaaaa). Я хотел бы получить вывод ( output.txt) из grepэтих файлов, но я хочу оставить строки пустыми, как в первом файле.

Пример:

  • файл1: UNIPROT_interactors.txt

    QR846OI
    ПО3Р56
    UJ6Y68
    
    Ю654Р
    PL92WS
    GH654Y _ HUY765R
    ПИХЮД
    
  • файл 2: GOOD_Interactors.txt

    TYRT68Y аааааааааа
    QR846OI ббббббб
    FDR59I cccccccc
    PO3R56 дддддд
    UJ6Y68 ээээээ
    VFR6y7 ffffff
    ПИХЮД гггггггг
    UH7609 ххххххх
    
  • файл output.txt(тот же формат файла 1)

    QR846OI bbbbbbbbb
    PO3R56 дддддд
    UJ6Y68 ээээээ
    
    Ю654Р
    PL92WS
    GH654Y _ HUY765R
    ПИХЮД гггггггг
    

Я пытался использовать этот код:

grep -f Uniprot_interactors.txt GOOD_interactors.txt > output.txt

но формат файла 1 не сохранился и пустые строки были удалены.

0
16.06.2020, 16:45
2 ответа

зациклиться на строке чтения file1, если она пуста, вывести ее, иначе grep соответствующие данные и распечатать их

while read line ; do
    if ((${#line}));then
        grep "${line}" file2
    else
        echo
    fi
done < file1 > output.txt

или

file2content="$(cat file2)";
while read line ; do
    if ((${#line}));then
        grep "${line}" <<< "${file2content}"
    else
        echo
    fi
done < file1 > output.txt
0
18.03.2021, 23:27

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


Использование awkдля сохранения хороших интеракторов в ассоциативном массиве namesс идентификатором Uniprot в качестве ключа. Затем вывод этих интеракторов в зависимости от идентификатора Uniprot в первом столбце (при передаче строк с более чем одним столбцом или без заведомо исправных интеракторов без изменений):

$ awk 'FNR==NR { names[$1] = $0; next } NF > 1 || !($1 in names) { print; next } { print names[$1] }' GOOD_Interactors.txt UNIPROT_interactors.txt
QR846OI bbbbbbbbb

PO3R56 ddddddd
UJ6Y68 eeeeeee


YU654R

PL92WS
GH654Y _ HUY765R
PIHYUD gggggggg

Обратите внимание, что мы передаем оба файла в качестве входных данных для команды awk. При чтении из первого файла сработает только блок с условием FNR==NR, а при чтении из второго файла этот блок будет пропущен.

Специальные переменные FNR, NRи NFпредставляют собой количество записей (строк ), считанных из текущего файла, количество записей, прочитанных за все время, и количество полей (столбцов )в текущей записи соответственно.

1
18.03.2021, 23:27

Теги

Похожие вопросы