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

Regex 如果有第6列,则从文本中提取第一列和第6列,regex,grep,cut,Regex,Grep,Cut,我有以下格式的数据,如果有第六列,我想提取第一列和第6列: ID1 Bacteria;Firmicutes;Clostridia;Clostridiales; ID2 Bacteria;Firmicutes;Clostridia;Clostridiales;Eubacteriaceae;Eubacterium;Eubacterium hallii; ID3 Bacteria;Firmicutes; ID4 Bacteria;Firmicut

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

您可以使用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
您可以使用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

Grep用于带有6个
的行

egrep '(.*;){6}' file
使用delimeter
切割柱
1,6

cut -f1,6 -d';' file
删除
\s.*垃圾(注意我不使用sed,perl适合正则表达式):

现在总共:

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

这是一个使用grep、cut和regex的答案。

grep表示带有6个
的行

egrep '(.*;){6}' file
使用delimeter
切割柱
1,6

cut -f1,6 -d';' file
删除
\s.*垃圾(注意我不使用sed,perl适合正则表达式):

现在总共:

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


这是一个使用grep、cut和regex的答案。

答案不错。我猜如果你不指定分隔符是;awk假设只有两列被空格隔开,提取字段要困难得多。人们仍然使用awk吗?@pguardiario是的,他们使用;-)@有人对每种语言都有这样的看法(观察/坏/神秘等)。这既不能使它们正确,也不能阻止人们使用这些语言。整个
Awk是一个晦涩难懂的实用程序,语法晦涩难懂。还不知道它的人都不会费心去学它,因为它只是一只恐龙
完全是你的观点,事实上,你听起来像个专制主义者,这并不能让它变得更真实。你唯一的论点是标签。OP接受我的答案的事实表明OP并不介意awk解决方案。+1向上投票主要是为了表明与@pguardiano的强烈分歧。Awk之所以“晦涩”,是因为它“专业化”。它专门针对这类问题,这一事实使得它比你认为最不晦涩的通用语言的相应解决方案更加优雅和简洁。如果你发现自己反复面对这类问题,这是学习另一个好工具的良好动机。回答得好。我猜如果你不指定分隔符是;awk假设只有两列被空格隔开,提取字段要困难得多。人们仍然使用awk吗?@pguardiario是的,他们使用;-)@有人对每种语言都有这样的看法(观察/坏/神秘等)。这既不能使它们正确,也不能阻止人们使用这些语言。整个
Awk是一个晦涩难懂的实用程序,语法晦涩难懂。还不知道它的人都不会费心去学它,因为它只是一只恐龙
完全是你的观点,事实上,你听起来像个专制主义者,这并不能让它变得更真实。你唯一的论点是标签。OP接受我的答案的事实表明OP并不介意awk解决方案。+1向上投票主要是为了表明与@pguardiano的强烈分歧。Awk之所以“晦涩”,是因为它“专业化”。它专门针对这类问题,这一事实使得它比你认为最不晦涩的通用语言中的相应解决方案更加优雅和简洁,而且如果你发现自己反复面对这类问题,它会很好地激励你学习另一个好工具。好吧,我使用grep,cut,海报上已经知道(我想)的regex,我很乐意澄清任何需要它的东西,我也很乐意解释OP需要的东西。事实上,我已经解释了我的工作原理。正如我之前所说,您需要一个理由来否决投票。如果您最终还是使用Perl,那么最好使用Perl<代码>perl-lnaF';'-e’下一个,除非$#F>5$F[0]=~s/\t./\t/;打印$F[0],$F[5]'
。。。然而,Perl是不明确的。(:我也不喜欢awk。但在这种情况下,awk更容易理解。无论如何,谢谢你的解释。好吧,我用的是海报上已经知道的grep、cut和regex(我想)我很高兴澄清任何需要它的东西。我也很高兴解释OP需要的任何东西。事实上,我已经解释了我的工作原理。正如我之前所说,你需要一个理由来否决投票。如果你最终还是使用Perl,那么最好用Perl来完成。下一步,除非$#F>5;$F[0]=~s/\t./\t/;print$F[0],$F[5]“
…Perl是晦涩难懂的,不过。(-:我也不喜欢awk。但在这种情况下,awk更容易理解。无论如何,谢谢你的解释。