繁体   English   中英

从 Linux 中的文件中提取文本:特定行; 在 2 种不同的模式之间

[英]Extract text from file in Linux: specific line; between 2 different patterns

我有一堆文本文件,都具有相同的结构,我需要在特定的行中提取特定的部分。

我可以用 awk 轻松提取行:

awk 'NR==23' blast_out.txt

CP046310.1 Lactobacillus jensenii strain FDAARGOS_749 chromosome,...  787     0.0 

但我不想要整行,而只是左侧第一个空格(在CP046310.1之后)和右侧双空格(在787之前)之间的部分。 最终的 output 应该是:

Lactobacillus jensenii strain FDAARGOS_749 chromosome,...

我尝试了 awk 和 grep 的几种组合,但找不到正确的组合来提取此特定模式。

对于您显示的示例,请尝试遵循awk代码。 简单的解释是,取消第一个、第二个最后一个字段和最后一个字段,然后用 NULL 全局替换起始和结束空间,然后打印该行。

awk '{$1=$NF=$(NF-1)="";gsub(/^ +| +$/,"")} 1' Input_file

使用sed您可以使用此解决方案:

sed -En '23s/^[^ ]+ |  .*$//gp' file

Lactobacillus jensenii strain FDAARGOS_749 chromosome,...

或使用awk

 awk 'NR == 23 {gsub(/^[^ ]+ |  .*$/, ""); print}' file

如果我得到您的要求,您想提取从第二个(包含)到倒数第二个(排除)的字段。 我会 go 与:

awk ' FNR==23 {for (i = 2; i < NF - 2; i++) { printf("%s ", $i) }; printf("%s\n", $i); exit }' file_path

您发布的行的示例:

$ echo "CP046310.1 Lactobacillus jensenii strain FDAARGOS_749 chromosome,...  787     0.0" | awk '{for (i = 2; i < NF - 2; i++) { printf("%s ", $i) }; printf("%s\n", $i); exit }'
$ Lactobacillus jensenii strain FDAARGOS_749 chromosome,... 

我假设chromosome,...不包含空格,并且您只有一个空格来分隔要提取的字段。 如果第二个条件不成立,则删除那些多余的空格。

使用 Perl:

echo "CP046310.1 Lactobacillus jensenii strain FDAARGOS_749 chromosome,...  787     0.0"|perl -ne 'm/ (.*?)  /; print $1'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM