如何使用 sed 管道将偶数行和奇数行中的小写字母更改为“-”?

如何使用 sed 管道将偶数行和奇数行中的小写字母更改为“-”?

我想使用 Unix 命令将小写序列 (a,t,c,g) 转换为“-”。但它没有将文件保存到位。相反,它显示错误并删除终端中的“-i”输出,但不会更改文件中的任何内容。但是,它会在终端中输出以下代码的所需结果,但不会更改文件。可以看到头信息后面是序列对。我只想更改序列对,保持标头信息不变。该文件的性质是:

0 chr1 11680 11871 chr6 28206109 28206336 - 4581
ctggagattctta-ttagtgatttgggctggggcc-tggccatgtgtattttttta-aatttccactgatgattttgctgcatggccggtgttgagaatgactgCG-CAAATTTGCCGGATTTCCTTTGCTGTTCCTGCATGTAGTTTAAACGAGATTGCCAGCACCGGGTATCATTCAC----------------------------------------------CATTTTTCTTTTCGTT
-TAGGGAGTCTTAGTCAAAGGTTTGGACCAAGTCCCTGGCCATGCAGATCTTTGTAGAATCTCCACTCGTGACTTTCCTGCATAACCAGAGTTGAGCATCTTTGAGTCAAGTGTGCCA-ACTTTCTTTGCTGTT-------------TAAATAAGGATGCCAACACCGCATGTCATTAACAGTCTCGTAGGTTGATTGATTTGTTGGCTGGCTCAAAAATGAGAGTTATTTTTCATTTTGTT

1 chr1 11872 12139 chr6 28206484 28206708 - 4257
AACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT
AGTTTTCTGTCTGCTAATT-TGCCACCAGTCATTTCCTATTACGTGTGTCTGCTGCCTCCTAGCCCAGGCT-----TGCCCTTCCTCCC--TCTTCTGAGGTGTCATAGGGTCGTGAC--------------------TTACCTGGTTTGGGGGAGTAGTTGG---------------AAGCTGAGTGA-GTGGTGGGGTTTTCTTATGCTAAAGACCTGCGTCCAGTATAGGAAGAGCCATGTGCCTCCACTCTGGCCCTTGTGGTCT

2 chr1 12177 12259 chr17 66149263 66149338 + 3811
GATTGGAGGAAAGATGAGTGAGAGCATCAACTTCTCTCACAACCTAGGCCAGTAAGTAGTGCTTGTGCTCATCTCCTTGGCTG
GGTTGGAGGGAAGATGAGTGAAGGGATCAATTTCTCTGATGACCTGGGCCGGTAGG-------TGTGGTGTCCTCTTTGTCTG

期望的输出:

0 chr1 11680 11871 chr6 28206109 28206336 - 4581
---------------------------------------------------------------------------------------------------------CG-CAAATTTGCCGGATTTCCTTTGCTGTTCCTGCATGTAGTTTAAACGAGATTGCCAGCACCGGGTATCATTCAC----------------------------------------------CATTTTTCTTTTCGTT
-TAGGGAGTCTTAGTCAAAGGTTTGGACCAAGTCCCTGGCCATGCAGATCTTTGTAGAATCTCCACTCGTGACTTTCCTGCATAACCAGAGTTGAGCATCTTTGAGTCAAGTGTGCCA-ACTTTCTTTGCTGTT-------------TAAATAAGGATGCCAACACCGCATGTCATTAACAGTCTCGTAGGTTGATTGATTTGTTGGCTGGCTCAAAAATGAGAGTTATTTTTCATTTTGTT

1 chr1 11872 12139 chr6 28206484 28206708 - 4257
AACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT
AGTTTTCTGTCTGCTAATT-TGCCACCAGTCATTTCCTATTACGTGTGTCTGCTGCCTCCTAGCCCAGGCT-----TGCCCTTCCTCCC--TCTTCTGAGGTGTCATAGGGTCGTGAC--------------------TTACCTGGTTTGGGGGAGTAGTTGG---------------AAGCTGAGTGA-GTGGTGGGGTTTTCTTATGCTAAAGACCTGCGTCCAGTATAGGAAGAGCCATGTGCCTCCACTCTGGCCCTTGTGGTCT

2 chr1 12177 12259 chr17 66149263 66149338 + 3811
GATTGGAGGAAAGATGAGTGAGAGCATCAACTTCTCTCACAACCTAGGCCAGTAAGTAGTGCTTGTGCTCATCTCCTTGGCTG
GGTTGGAGGGAAGATGAGTGAAGGGATCAATTTCTCTGATGACCTGGGCCGGTAGG-------TGTGGTGTCCTCTTTGTCTG
#for even lines
sed -n 2~2p h.txt| sed 's/a/-/g' | sed 's/t/-/g' | sed 's/c/-/g' | sed 's/g/-/g' 
#for odd lines
sed -n 1~2p h.txt| sed -n 2~2p | sed 's/a/-/g'| sed 's/t/-/g' | sed 's/c/-/g' | sed 's/g/-/g' 

答案1

我会使用perl它,因为它有一个$.保存当前行号的特殊变量。因此,如果$.模 2 为 0 ( if $. % 2 == 0),则我们将所有出现的at或更改为:cg-

$ perl -pe 's/[actg]/-/g if $. % 2 == 0' file 
0 chr1 11680 11871 chr6 28206109 28206336 - 4581
--------------------------------------------------------------------------------------------------------CG-CAAATTTGCCGGATTTCCTTTGCTGTTCCTGCATGTAGTTTAAACGAGATTGCCAGCACCGGGTATCATTCAC----------------------------------------------CATTTTTCTTTTCGTT
cTAGGGAGTCTTAGTCAAAGGTTTGGACCAAGTCCCTGGCCATGCAGATCTTTGTAGAATCTCCACTCGTGACTTTCCTGCATAACCAGAGTTGAGCATCTTTGAGTCAAGTGTGCCA-ACTTTCTTTGCTGTT-------------TAAATAAGGATGCCAACACCGCATGTCATTAACAGTCTCGTAGGTTGATTGATTTGTTGGCTGGCTCAAAAATGAGAGTTATTTTTCATTTTGTT

1 chr1 11872 12139 chr6 28206484 28206708 - 4257
AACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT
AGTTTTCTGTCTGCTAATT-TGCCACCAGTCATTTCCTATTACGTGTGTCTGCTGCCTCCTAGCCCAGGCT-----TGCCCTTCCTCCC--TCTTCTGAGGTGTCATAGGGTCGTGAC--------------------TTACCTGGTTTGGGGGAGTAGTTGG---------------AAGCTGAGTGA-GTGGTGGGGTTTTCTTATGCTAAAGACCTGCGTCCAGTATAGGAAGAGCCATGTGCCTCCACTCTGGCCCTTGTGGTCT

2 chr1 12177 12259 chr17 66149263 66149338 + 3811
GATTGGAGGAAAGATGAGTGAGAGCATCAACTTCTCTCACAACCTAGGCCAGTAAGTAGTGCTTGTGCTCATCTCCTTGGCTG
GGTTGGAGGGAAGATGAGTGAAGGGATCAATTTCTCTGATGACCTGGGCCGGTAGG-------TGTGGTGTCCTCTTTGTCTG

要对原始文件进行更改,只需使用-i

perl -i -pe 's/[actg]/-/g if $. % 2 == 0' file 

但是,我认为您实际上并不只想要偶数线。您似乎想将序列线上的小写残基更改为破折号。如果是这样,您可以关注不包含任何空格的行并在那里进行更改:

$ perl -pe 's/[actg]/-/g if !/ /' file
0 chr1 11680 11871 chr6 28206109 28206336 - 4581
--------------------------------------------------------------------------------------------------------CG-CAAATTTGCCGGATTTCCTTTGCTGTTCCTGCATGTAGTTTAAACGAGATTGCCAGCACCGGGTATCATTCAC----------------------------------------------CATTTTTCTTTTCGTT
-TAGGGAGTCTTAGTCAAAGGTTTGGACCAAGTCCCTGGCCATGCAGATCTTTGTAGAATCTCCACTCGTGACTTTCCTGCATAACCAGAGTTGAGCATCTTTGAGTCAAGTGTGCCA-ACTTTCTTTGCTGTT-------------TAAATAAGGATGCCAACACCGCATGTCATTAACAGTCTCGTAGGTTGATTGATTTGTTGGCTGGCTCAAAAATGAGAGTTATTTTTCATTTTGTT

1 chr1 11872 12139 chr6 28206484 28206708 - 4257
AACTTGCCGTCAGCCTTTTCTTTGACCTCTTCTTTCTGTTCATGTGTATTTGCTGTCTCTTAGCCCAGACTTCCCGTGTCCTTTCCACCGGGCCTTTGAGAGGTCACAGGGTCTTGATGCTGTGGTCTTCATCTGCAGGTGTCTGACTTCCAGCAACTGCTGGCCTGTGCCAGGGTGCAAGCTGAGCACTGGAGTGGAGTTTTCCTGTGGAGAGGAGCCATGCCTAGAGTGGGATGGGCCAT-TGTTCATCTTCTGGCCCCTGTTGTCT
AGTTTTCTGTCTGCTAATT-TGCCACCAGTCATTTCCTATTACGTGTGTCTGCTGCCTCCTAGCCCAGGCT-----TGCCCTTCCTCCC--TCTTCTGAGGTGTCATAGGGTCGTGAC--------------------TTACCTGGTTTGGGGGAGTAGTTGG---------------AAGCTGAGTGA-GTGGTGGGGTTTTCTTATGCTAAAGACCTGCGTCCAGTATAGGAAGAGCCATGTGCCTCCACTCTGGCCCTTGTGGTCT

2 chr1 12177 12259 chr17 66149263 66149338 + 3811
GATTGGAGGAAAGATGAGTGAGAGCATCAACTTCTCTCACAACCTAGGCCAGTAAGTAGTGCTTGTGCTCATCTCCTTGGCTG
GGTTGGAGGGAAGATGAGTGAAGGGATCAATTTCTCTGATGACCTGGGCCGGTAGG-------TGTGGTGTCCTCTTTGTCTG

再次,要修改原始文件而不是打印到标准输出,请使用-i

perl -i -pe 's/[actg]/-/g if !/ /' file

答案2

不明白如何解释偶数/奇数的事情,我想出了

sed '/[^acgtACGT-]/!s/[acgt]/-/g' file

包含除 a、c、g、t、A、C、G、T 或“-”之外的任何字符的行将不加更改地打印。任何剩余行都会将其小写字符替换为“-”重定向到临时文件,然后覆盖原始文件。

答案3

基本上,您可以使用 a,t,c,g 到 - 在一行中使用:

sed -i 's/[atcg]/-/g' FILE

当然,这会改变所有线路。您需要选择将这些应用到何处。通常最好使用某种模式匹配来做到这一点,但如果您坚持根据行号执行此操作,那么首先您需要了解您编写的以下命令的作用:

sed -n 1~2p h.txt| sed -n 2~2p ...

这实际上从第三个数字开始每第四步打印一次,并且可以替换为:3~4

因此,将这些结合起来:

sed -i '2~2s/[atcg]/-/g; 3~4s/[atcg]/-/g' FILE

顺便说一下,2~2这只适用于这种情况,因为每第四行都是空的。在这种情况下,您实际上可以将其替换为2~4,而无需尝试操作空行。

但无论如何,大多数人会做的是通过模式匹配来区分“标题”和“非标题”行。例如,假设您的所有标题行(以及仅有的标题行)以数字开头,您可以通过以下方式忽略它们:

sed -i '/^[0-9]/! s/[atcg]/-/g' FILE

相关内容