Извлечь указанные c столбцы из файла с помощью сценария оболочки - PullRequest
0 голосов
/ 05 марта 2020

У меня огромный текстовый файл, из которого я хочу извлечь указанные c столбцы. Я могу сделать это в python, но, поскольку файл имеет ~ 1,2 миллиарда строк, это замедляет работу. Файл выглядит так (показана одна строка):

chr1    9734    10486   ID=SRX502813;Name=Input%20control%20(@%20IMR-90);Title=GSM1358818:%20HIRA%20OIS%20Control%20input%20DNA%3B%20Homo%20sapiens%3B%20ChIP-Seq;Cell%20group=Lung;<br>source_name=Fibroblasts;cell%20line=IMR90;chip%20antibody=none; 1000    .   9734    10486   255,0,0

Теперь я хотел бы извлечь первые три столбца и идентификатор, который является частью четвертого столбца:

chr1    9734    10486   SRX502813

Я могу извлечь первые три столбца с помощью следующего кода, но не могу заставить работать разбиение подстроки в 4-м столбце:

#!/usr/bin/bash
# -*- coding: None -*-
end_of_file=0
while [[ $end_of_file == 0 ]]; do
  read -r line
  end_of_file=$?
  grep SRX* | cut -f 1-3 >> out_file.txt
done < "$1"

Возможно, кто-то может дать подсказку о том, как решить эту проблему? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Использование awk.

awk -F';' '{sub(/ID=/,"");print $1}' inputfile
0 голосов
/ 05 марта 2020

Предполагая, что 4-й столбец всегда начинается с ID=, за которым следует идентификатор, за которым следует ;, и предполагая, что первые 3 столбца не содержат ID=, вы можете использовать sed, например,

sed 's/ID=\([^;]*\);.*/\1/' inputfile

Это захватывает последовательность символов, кроме ; после ID=. Если идентификатор не всегда завершается символом ;, вы можете использовать альтернативный шаблон, который ищет последовательность букв alphanumeri c символов

sed 's/ID=\([[:alnum:]]*\).*/\1/' inputfile

Когда я создаю файл inputfile, который содержит точно Строка из вопроса, я получаю результат

chr1    9734    10486   SRX502813

Если вы хотите извлечь только строки, содержащие ID=SRX, вы можете объединить это с fgrep

fgrep 'ID=SRX' inputfile | sed 's/ID=\([^;]*\);.*/\1/'
...