【问题标题】:Modifying/ Manipulating Text Using sed, awk or vim使用 sed、awk 或 vim 修改/操作文本
【发布时间】:2013-02-18 09:55:43
【问题描述】:

我正在尝试从以下位置操作此文本文件:

>hg19_ct_UserTrack_3545_MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA

>MACS_peak_2_range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA

我一直在使用 sed 和 vim 来获取它,但我无法获得第一行所需的空格组合或确切信息(没有它,程序无法运行)

谢谢 哈丽特

【问题讨论】:

  • MACS_peak_2 动态的吗?这部分有什么规定吗?
  • 据我所知,没有规则;在第 xx 峰处,DNA 序列是标题下方列出的序列

标签: unix vim text sed awk


【解决方案1】:

如果MACS_peak_2 是固定字符串:

sed 's/>.*MACS/>MACS/; s/ /_/' file

会做的工作:

kent$  echo ">hg19_ct_UserTrack_3545_MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA"|sed 's/>.*MACS/>MACS/; s/ /_/'
>MACS_peak_2_range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA

如果您想在 vim 中执行此操作:

:g/^>hg/s/hg.*MAC/MAC/|s/ /_/

此行将替换所有以>hg 开头的行,试试吧。

【讨论】:

  • 不,MACS_peak_2 不是固定的,MACS_peak 部分是固定的,但数字会发生变化(它们基本上是提取以下文本的坐标名称)
  • 好的,没关系,只要MACS 是固定的,这两种解决方案都适合你。试试看。
  • 谢谢。我试过 vim 但我得到一个特殊的标题: >MACS_peak_718_range=chr19_gl000208_random:192-392 5'pad=0 3'pad=0 strand=+ repeatMasking=none AATGAACCCTTGCAGATACTAGAGAAAGACTGTTTCAAAACTGCTCTATC 我需要保留 MACS_peak_2_range=chr1:777590-77797完全相同的。谢谢
  • 所以你希望每个目标标题行都有固定的MACS_peak_2_range=chr1:777590-777790 ?
  • @user1879573 奇怪,sed 和 vim 行在这里给出相同的结果。无论如何,当你说它有效时,这很重要。 .. :)
【解决方案2】:

使用 awk(因为 Kent 提供了 sed 解决方案)

awk '/^>/sub(/hg19_ct_UserTrack_3545_/, "")' input

要将第一个空格更改为下划线,请添加另一个子:

awk '/^>/sub(/hg19_ct_UserTrack_3545_/, "");sub(/ /, "_")' input

sed 可能是解决这个问题的更好方法。

【讨论】:

  • 根据示例,peak_2range 之间还有一个空格需要更改为下划线。
【解决方案3】:

以下内容进行了就地替换。执行命令后,文件将被更改。

perl -pe 's/^\>.*?(MACS_peak.*)/>$1/g' your_file

请看下面的测试:

> cat temp
>hg19_ct_UserTrack_3545_MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA
> 
> 
> 
> 
> perl -pe 's/^\>.*?(MACS_peak.*)/>$1/g' temp
>MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA
> 
> 
> 
> perl -pi -e 's/^\>.*?(MACS_peak.*)/>$1/g' temp
> 
> 
> 
> cat temp
>MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA
> 

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2011-01-10
    • 2013-01-26
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多