Grep and print only certain columns from a row

Hi Friends,

This is my input

chr1 100 200 + gene_name "alpha"; protein_name "alpha"; level 2; tag "basic"; info "known";
chr1 245 290 + gene_name "alpha-1"; protein_name "alpha-2"; level 9; tag "basic"; info "uknown";
chr1 310 320 + gene_name "alpha"; protein_name "alpha-4"; level 2; info "known";
chr1 355 490 + gene_name "alpha-1"; protein_name "alpha-120"; tag "basic"; info "valid";

The above input file has varying field separators and has more than 1 million rows. If I want certain columns, I know that I can use awk to print only certain columns. But, my input file has varying number of columns too. So, I can't do it.

My request here is to print only certain parts of a row by using grep until the semicolon. So, I need chr, start, stop, symbol, gene_name, protein_name and info from each row.

My output will be

chr1 100 200 + gene_name "alpha"; protein_name "alpha"; info "known";
chr1 245 290 + gene_name "alpha-1"; protein_name "alpha-2"; info "uknown";
chr1 310 320 + gene_name "alpha"; protein_name "alpha-4"; info "known";
chr1 355 490 + gene_name "alpha-1"; protein_name "alpha-120"; info "valid";

How do I print only the grepped contents until the semicolon?

Thanks for any suggestions.

awk -F ";" '{for(i=1;i<=NF;i++){if($i ~ /chr|start|stop|symbol|gene_name|protein_name|info/){s=s?s";"$i:$i}}print s;s=""}' file
1 Like

Dear Pamu,

Thanks a lot for your time.

I apologize for forgetting another small glitch in the input.

Between the chr, start and stop, there are two more columns.

I looked for unique names in those two columns and the second column has

HAVANA
ENSEMBL

The third column has

exon
CDS
start_codon
stop_codon

So, my input file is like this

chr1 HAVANA exon 100 200 + gene_name "alpha"; protein_name "alpha"; level 2; tag "basic"; info "known";
chr1 ENSEMBLE start_codon 245 290 + gene_name "alpha-1"; protein_name "alpha-2"; level 9; tag "basic"; info "uknown";
chr1 HAVANA CDS 310 320 + gene_name "alpha"; protein_name "alpha-4"; level 2; info "known";
chr1 ENSEMBLE stop_codon 355 490 + gene_name "alpha-1"; protein_name "alpha-120"; tag "basic"; info "valid";

Then my input becomes

chr1 HAVANA exon 100 200 + gene_name "alpha"; protein_name "alpha"; info "known";
chr1 ENSEMBLE start_codon 245 290 + gene_name "alpha-1"; protein_name "alpha-2"; info "uknown";
chr1 HAVANA CDS 310 320 + gene_name "alpha"; protein_name "alpha-4"; info "known";
chr1 ENSEMBLE stop_codon 355 490 + gene_name "alpha-1"; protein_name "alpha-120"; info "valid";

I edited the code with

[HAVANA:ENSEMBLE]

, but it didn't work.

I apologize for forgetting those two columns. Thanks again.

Try

awk -F";" -v OFS=";" '{print $1, $2, $5}' file
chr1 HAVANA exon 100 200 + gene_name "alpha"; protein_name "alpha"; info "known"
chr1 ENSEMBLE start_codon 245 290 + gene_name "alpha-1"; protein_name "alpha-2"; info "uknown"
chr1 HAVANA CDS 310 320 + gene_name "alpha"; protein_name "alpha-4";
chr1 ENSEMBLE stop_codon 355 490 + gene_name "alpha-1"; protein_name "alpha-120";