我有以下格式的数据,如果有第六列,我想提取第一列和第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
,但认为你会有更好的解决方案。提前谢谢!
答案 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的答案。