0

这就是我的输入的样子:

>a
AACTCTCTC
CGTGCTCTC
>b_random
ACTGSTSTS
CTCTCTCCT
ATATATA
>c
AACTCTCTC
CGTGCTCTC
>d
AACTCTCTC
CGTGCTCTC
CGTGCTCTC
>e_random
ACTGSTSTS
CTCTCTCCT
ATATATA
>c_random
ACTGSTSTS
CTCTCTACT
GSTSTSCTC
TCTCCTCCT
ATATATA

我想删除所有包含短语“随机”的序列 - 序列始终以“>”开头,并在另一个序列开始时结束。

在这种情况下,我想获得 3 个文件:

一个.txt

>a
AACTCTCTC
CGTGCTCTC

c.txt

>c
AACTCTCTC
CGTGCTCTC

d.txt

>d
AACTCTCTC
CGTGCTCTC
CGTGCTCTC

现在,我不知何故不能强迫 sed 做我想做的事。我从这个开始:

 sed 's/random.*random//g' sample_data

什么不起作用。非常感谢你。

4

4 回答 4

2

最简单的方法可能是使用 awk 和合理的 RS/ORS 设置:

awk '$1 !~ /random/ { print RS $0 > $1 ".txt"; close($1 ".txt" }' RS='>' ORS=''

如果您有包含空格的描述行,您也需要设置FS='\n'

于 2013-02-19T08:59:00.710 回答
2

这是使用awk它应该处理大文件的一种方法:

awk '/^>/ { i=substr($0,2) } i ~ /random/ { i="" } i { print > i ".txt" }' file

结果grep . *.txt

a.txt:>a
a.txt:AACTCTCTC
a.txt:CGTGCTCTC
c.txt:>c
c.txt:AACTCTCTC
c.txt:CGTGCTCTC
d.txt:>d
d.txt:AACTCTCTC
d.txt:CGTGCTCTC
d.txt:CGTGCTCTC
于 2013-02-19T10:33:58.373 回答
1
awk '/\>/ && $0!~/random/{file=substr($0,2)".txt";f=1}{if($0~/random/)f=0;if(f)print>file}' your_file
于 2013-02-19T10:36:19.937 回答
1

另一个不使用 RS 的 awk 以避免限制

awk -F\> '/>/{close(f); f=/random/?x:$2 ".txt"} f{print>f}' file

此版本还关闭文件并使用变量作为文件名,因为某些 awk 无法处理连接的打印目标。

于 2013-02-19T14:39:16.347 回答