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