У меня проблема с 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 не сохранился и пустые строки были удалены.
зациклиться на строке чтения 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
Вы не можете использовать 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
представляют собой количество записей (строк ), считанных из текущего файла, количество записей, прочитанных за все время, и количество полей (столбцов )в текущей записи соответственно.