基于模式匹配打印行和后续文本

基于模式匹配打印行和后续文本

我正在尝试根据后续行中的模式过滤文本文件中的行,以保持模式匹配的行。我还需要重命名模式匹配的文件

例如:

>text chr1    
AAA  
BBA  
AAA  
>additional text chr2  
ABA  
AAA  
CCC  
TTT  
>some text chr3  
TTT  
CCC  
TCT  
>no good text 1 3  
AAA  
CCC  
TCT  
>unimportant text 2 3 3  
ACC  
CCC  
TCT  

该命令将打印包含“chr”的行以及所有后续行,直到以“>”开头的行不包含“chr”:

>chr1  
AAA  
BBA  
AAA  
>chr2  
ABA  
AAA  
CCC  
TTT  
>chr3   
TTT  
CCC  
TCT  

答案1

我使用 awk、grep 和 sed 完成此操作。假设原始文件中没有尾随空格。

awk 'NR>1&&/>/{print ""}{printf " %s", $0}END{print ""}' file |grep chr|sed 's/^ //' |sed 's/^.*chr/>chr/' |awk 'BEGIN{OFS="\n";}{print $1,$2,$3,$4}'

首先,组块以“>”开头,每个字段前面有一个空格

 >text chr1 AAA BBA AAA
 >additional text chr2 ABA AAA CCC TTT
 >some text chr3 TTT CCC TCT
 >no good text 1 3 AAA CCC TCT
 >unimportant text 2 3 3 ACC CCC TCT

其次,过滤包含子字符串“chr”的行

 >text chr1 AAA BBA AAA
 >additional text chr2 ABA AAA CCC TTT
 >some text chr3 TTT CCC TCT

第三,删除所有前导空格

>text chr1 AAA BBA AAA
>additional text chr2 ABA AAA CCC TTT
>some text chr3 TTT CCC TCT

第四,删除“">”和“chr”之间的所有字符

>chr1 AAA BBA AAA
>chr2 ABA AAA CCC TTT
>chr3 TTT CCC TCT

最后使用 awk 打印所有以“\n”作为输出文件分隔符的行

>chr1
AAA
BBA
AAA
>chr2
ABA
AAA
CCC
>chr3
TTT
CCC
TCT

相关内容