我正在尝试根据后续行中的模式过滤文本文件中的行,以保持模式匹配的行。我还需要重命名模式匹配的文件
例如:
>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