Как изменить шаблон в файле, который соответствует шаблону из столбца 1 в другом файле, а затем распечатать шаблон из столбца 2? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть файл gff3.txt с такими данными (миллиарды строк):

 scaffold1000|size145372 . gene 16987 23149 . - . ID=evm.TU.scaffold1000|size145372.2;Name=EVM%20prediction%20scaffold1000|size145372.2
 scaffold1000|size145372 . mRNA 16987 23149 . - . ID=evm.model.scaffold1000|size145372.2;Parent=evm.TU.scaffold1000|size145372.2;Name=EVM%20prediction%20scaffold1000|size145372.2
 scaffold1000|size145372 . exon 22965 23149 . - . ID=evm.model.scaffold1000|size145372.2.exon1;Parent=evm.model.scaffold1000|size145372.2
 scaffold9|size467357 . gene 373475 396789 . + . ID=evm.TU.scaffold9|size467357.56;Name=EVM%20prediction%20scaffold9|size467357.56
 scaffold9|size467357 . mRNA 373475 396789 . + . ID=evm.model.scaffold9|size467357.56;Parent=evm.TU.scaffold9|size467357.56;Name=EVM%20prediction%20scaffold9|size467357.56
 scaffold9|size467357 . exon 373475 373695 . + . ID=evm.model.scaffold9|size467357.56.exon1;Parent=evm.model.scaffold9|size467357.56
 ...

И другой файл `position.txt (миллиарды строк):

 scaffold1000|size145372.2  scaffold1000|size145372:16987-23149
 scaffold9|size467357.56    scaffold10008|size45161:373475-396789
 ...

И я ищу, чтобы получить это:

 scaffold1000|size145372 . gene 16987 23149 . - . ID=evm.TU.scaffold1000|size145372:16987-23149;Name=EVM%20prediction%20scaffold1000|size145372:16987-23149
 scaffold1000|size145372 . mRNA 16987 23149 . - . ID=evm.model.scaffold1000|size145372:16987-23149;Parent=evm.TU.scaffold1000|size145372:16987-23149;Name=EVM%20prediction%20scaffold1000|size145372:16987-23149
 scaffold1000|size145372 . exon 22965 23149 . - . ID=evm.model.scaffold1000|size145372:16987-23149.exon1;Parent=evm.model.scaffold1000|size145372:16987-23149
 scaffold9|size467357 . gene 373475 396789 . + . ID=evm.TU.scaffold10008|size45161:373475-396789;Name=EVM%20prediction%20scaffold10008|size45161:373475-396789
 scaffold9|size467357 . mRNA 373475 396789 . + . ID=evm.model.scaffold10008|size45161:373475-396789;Parent=evm.TU.scaffold10008|size45161:373475-396789;Name=EVM%20prediction%20scaffold10008|size45161:373475-396789
 scaffold9|size467357 . exon 373475 373695 . + . ID=evm.model.scaffold10008|size45161:373475-396789.exon1;Parent=evm.model.scaffold10008|size45161:373475-396789
 ...

Поэтому я хотел бы найти в столбце $9 файла gff3.txt шаблоны, которые соответствуют столбцу $1 в position.txt и затем измените их в соответствии с шаблоном столбца 2 файла position.txt.

Я попытался с помощью awk:

 awk '
     NR==FNR{a[$9]
     next
 }
 ($2 in a) {
     print
 }' gff3.txt position.txt > output.txt

Но это не сработало.Может быть, это связано с тем, что шаблоны в столбце $9 из gff3.txt включены в другую информацию?

Я также пытаюсь адаптировать эти потоки к своим данным, но я не достиг этого: stackoverflow1 , stackoverflow2 , stackoverflow3 , stackExchange ...

Любые рекомендации по кодированию этого в awk, sed или другие будут очень признательны.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я придумал это:

sed "$(<position.txt sed 's/\./\\./g' | xargs -n2 printf "s@%s@%s@g\n")" gff3.txt

Сначала я беру position.txt и заменяю каждые . на \., чтобы он экранировался для sed.Затем из каждой строки я генерирую sed команду подстановки s/<first column>/<second column>/g, используя xargs и простой printf.Вывод подается в sed в качестве сценария, а sed принимает gff3.txt и выполняет преобразования для него.Если нет «странных» входных данных (встроенные пробелы, новые строки, все строки уникальны и т. Д.), Я думаю, что это может сработать.

Тестовый скрипт:

#!/bin/bash

cat <<EOF >gff3.txt 
scaffold1000|size145372 . gene 16987 23149 . - . ID=evm.TU.scaffold1000|size145372.2;Name=EVM%20prediction%20scaffold1000|size145372.2
scaffold1000|size145372 . mRNA 16987 23149 . - . ID=evm.model.scaffold1000|size145372.2;Parent=evm.TU.scaffold1000|size145372.2;Name=EVM%20prediction%20scaffold1000|size145372.2
scaffold1000|size145372 . exon 22965 23149 . - . ID=evm.model.scaffold1000|size145372.2.exon1;Parent=evm.model.scaffold1000|size145372.2
scaffold9|size467357 . gene 373475 396789 . + . ID=evm.TU.scaffold9|size467357.56;Name=EVM%20prediction%20scaffold9|size467357.56
scaffold9|size467357 . mRNA 373475 396789 . + . ID=evm.model.scaffold9|size467357.56;Parent=evm.TU.scaffold9|size467357.56;Name=EVM%20prediction%20scaffold9|size467357.56
scaffold9|size467357 . exon 373475 373695 . + . ID=evm.model.scaffold9|size467357.56.exon1;Parent=evm.model.scaffold9|size467357.56
EOF

cat <<EOF >position.txt
scaffold1000|size145372.2  scaffold1000|size145372:16987-23149
scaffold9|size467357.56    scaffold10008|size45161:373475-396789
EOF

cat <<EOF >exp.txt
scaffold1000|size145372 . gene 16987 23149 . - . ID=evm.TU.scaffold1000|size145372:16987-23149;Name=EVM%20prediction%20scaffold1000|size145372:16987-23149
scaffold1000|size145372 . mRNA 16987 23149 . - . ID=evm.model.scaffold1000|size145372:16987-23149;Parent=evm.TU.scaffold1000|size145372:16987-23149;Name=EVM%20prediction%20scaffold1000|size145372:16987-23149
scaffold1000|size145372 . exon 22965 23149 . - . ID=evm.model.scaffold1000|size145372:16987-23149.exon1;Parent=evm.model.scaffold1000|size145372:16987-23149
scaffold9|size467357 . gene 373475 396789 . + . ID=evm.TU.scaffold10008|size45161:373475-396789;Name=EVM%20prediction%20scaffold10008|size45161:373475-396789
scaffold9|size467357 . mRNA 373475 396789 . + . ID=evm.model.scaffold10008|size45161:373475-396789;Parent=evm.TU.scaffold10008|size45161:373475-396789;Name=EVM%20prediction%20scaffold10008|size45161:373475-396789
scaffold9|size467357 . exon 373475 373695 . + . ID=evm.model.scaffold10008|size45161:373475-396789.exon1;Parent=evm.model.scaffold10008|size45161:373475-396789
EOF

sed "$(<position.txt sed 's/\./\\./g' | xargs -n2 printf "s@%s@%s@g\n")" gff3.txt > output.txt

diff exp.txt output.txt

diffничего не печатает, поэтому работает для указанного примера ввода и ожидаемого вывода.

0 голосов
/ 16 мая 2019

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

GNU sed:

sed 's, +,$ ,g' position.txt | xargs -I {} sed -i 's {} g' gff3.txt

MAC OS:

sed -E 's, +,$ ,' position.txt | xargs -I {} sed -i '' 's {} g' gff3.txt

xargs -I выполнит sed для каждой строки position.txt на gff3.txt

{} будет заменен настрока gff3.txt.Первый столбец используется как шаблон, второй - как новое значение.

...