如果有第6列,则从第一列和第6列中提取文本

时间:2013-09-28 11:29:49

标签: regex grep cut

我有以下格式的数据,如果有第六列,我想提取第一列和第6列:

ID1        Bacteria;Firmicutes;Clostridia;Clostridiales;
ID2        Bacteria;Firmicutes;Clostridia;Clostridiales;Eubacteriaceae;Eubacterium;Eubacterium hallii;
ID3        Bacteria;Firmicutes;
ID4        Bacteria;Firmicutes;
ID5        Bacteria;Firmicutes;Clostridia;
ID6        Bacteria;
ID7        Bacteria;Firmicutes;Clostridia;Clostridiales;Ruminococcaceae;Faecalibacterium;
ID8        Bacteria;Firmicutes;Clostridia;Clostridiales;Ruminococcaceae;Faecalibacterium;Faecalibacterium prausnitzii;

输出应为:

ID2 Eubacterium
ID7 Faecalibacterium
ID8 Faecalibacterium

我尝试通过“;”来解决问题并且grep第6列cut -d ";" -f 6,但认为你会有更好的解决方案。提前谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用awk:

awk -F\; 'NF>=6{print substr ($1, 0, 4), $6}' file

如果有6个或更多字段,则它会根据分隔符;提取字段1和6。然后从字段1中提取前3个字符。

示例输出:

$ awk -F\; 'NF>=6{print substr ($1, 0, 4), $6}' file
ID2 Eubacterium
ID7 Faecalibacterium
ID8 Faecalibacterium

答案 1 :(得分:1)

Grep表示6 ;的行:

egrep '(.*;){6}' file

使用分隔符1,6

剪切列;
cut -f1,6 -d';' file

删除\s.*;垃圾(注意我不使用sed,perl适用于正则表达式):

perl -pe 's/\s.*;/ /'

现在:

egrep '(.*;){6}' file | cut -f1,6 -d';' | perl -pe 's/\s.*;/ /'

你去,使用grep,cut和regex的答案。