パターンマッチングに基づいて行と後続のテキストを印刷します。

パターンマッチングに基づいて行と後続のテキストを印刷します。

パターンに一致する行を維持するために、後続の行のパターンに基づいてテキストファイルの行をフィルタリングしたいと思います。また、パターンに一致するファイルの名前を変更する必要があります。

たとえば、

>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

おすすめ記事