0

我有以下格式的数据,如果有第六列,我想提取第一列和第 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 第六列cut -d ";" -f 6,但认为你会有更好的解决方案。先感谢您!

4

2 回答 2

2

您可以使用 awk:

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

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

样本输出:

$ awk -F\; 'NF>=6{print substr ($1, 0, 4), $6}' file
ID2 Eubacterium
ID7 Faecalibacterium
ID8 Faecalibacterium
于 2013-09-28T11:36:11.393 回答
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 的答案。

于 2013-09-29T12:13:22.070 回答