Unix 使用sed、awk或vim修改/操作文本
我正在尝试从以下位置操作此文本文件:Unix 使用sed、awk或vim修改/操作文本,unix,vim,text,sed,awk,Unix,Vim,Text,Sed,Awk,我正在尝试从以下位置操作此文本文件: >hg19_ct_UserTrack_3545_MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA CGGCTAGAGAATGGATGGTGA
>hg19_ct_UserTrack_3545_MACS_peak_2 range=chr1:777590-777790 5'pad=0 3'pad=0 strand=+ repeatMasking=none
TCCACCCACCGAAGTTGTTTGGTCCCAATCTGCAAAATCAGTTAAACGTC
TTCCTGCCTGGCAGCAGATCAAAGGGTGAGGGGTCTGGGACAGACAGAGA
CGGCTAGAGAATGGATGGTGAAGTGCTCAGAGGCCCTGTGGGCTATCCCA
到
我一直在使用sed和vim来获取它,但我无法获得第一行所需的空间组合或确切信息(没有它,程序无法工作)
谢谢
Harriet如果
MACS\u peak\u 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开头的行,请尝试。下面的行将进行就地替换。执行命令后,文件将被更改
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
>
使用awk(因为Kent提供了sed解决方案)
要将第一个空格更改为下划线,请添加另一个子空格:
awk '/^>/sub(/hg19_ct_UserTrack_3545_/, "");sub(/ /, "_")' input
sed可能是解决这个问题的更好的方法。MACS\u peak\u 2是动态的吗?这部分有什么规定吗?据我所知,没有规定;在峰值编号xx处,DNA序列是列在标题下方的序列否,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 aatgaccttgcagatagaaagagatgtcaaactgctctatc我需要保持MACS_peak_2_range=chr1:777590-777790完全相同。谢谢您希望每个目标标题行都有固定的MACS_peak_2_range=chr1:777590-777790
?@user1879573奇怪,sed和vim行在这里给出相同的结果。不管怎样,当你说它有效时,这很重要…:)根据示例,在peak_2
和range
之间还有一个空格需要更改为下划线。
awk '/^>/sub(/hg19_ct_UserTrack_3545_/, "")' input
awk '/^>/sub(/hg19_ct_UserTrack_3545_/, "");sub(/ /, "_")' input