[英]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.