Bash 删除文件的一部分

Bash 删除文件的一部分,bash,awk,sed,grep,Bash,Awk,Sed,Grep,在bash中,我想不出一个可以删除文件某个部分的解决方案,因此我将其发布在这里并寻求帮助 我有一个文件,看起来像这样: track type=wiggle_0 name= description= variableStep chrom=chr1 10203 3 10213 4 10223 5 10233 5 10243 4 10253 3 10263 3 10366 6 10376 10 track type=wiggle_0 name= descriptio

在bash中,我想不出一个可以删除文件某个部分的解决方案,因此我将其发布在这里并寻求帮助

我有一个文件,看起来像这样:

track type=wiggle_0 name= description=
variableStep chrom=chr1
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr2
10203   3
10213   4
10223   5
10233   5
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr3
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
track type=wiggle_0 name= description=
variableStep chrom=chrM
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chrX
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10
我想删除/删除该节

track type=wiggle_0 name= description=
    variableStep chrom=chrM
    10203   3
    10213   4
    10223   5
    10233   5
    10243   4
    10253   3
    10263   3
    10366   6
    10376   10
应该可以使用以下组合: grep和cut,但无法理解

为了清除它,我想删除包含chrM的块

提前感谢您提供的任何解决方案

注意:我在做什么

$ cat tst.awk /^track/ { track=$0 ORS; next } /chrom/  { f=(/chrM/ ? 1 : 0) } if { print track $0; track="" }
我得到了一个错误:

 bash: !f: event not found

您可以使用
gnu awk
,如下所示:

kw='track type=wiggle_0 name= description='
awk -v kw="$kw" -v RS="$kw[[:space:]]*" -v ORS= 'NR>1 && !/^variableStep chrom=chrM/{print kw "\n" $0}' file
输出:

track type=wiggle_0 name= description=
variableStep chrom=chr1
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr2
10203   3
10213   4
10223   5
10233   5
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr3
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
track type=wiggle_0 name= description=
variableStep chrom=chrX
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10

统一的awk解决方案:

awk '/^track type=wiggle_0 name= description=/{ if (f) f=0; t=$0; n=NR+1; next }
     n && NR==n{ 
         if (/variableStep chrom=chrM/) { f=1; next }
         else { print t; f=t=n=0 }
     }
     f{ next }1' file
输出:

track type=wiggle_0 name= description=
variableStep chrom=chr1
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr2
10203   3
10213   4
10223   5
10233   5
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr3
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
track type=wiggle_0 name= description=
variableStep chrom=chrX
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10

您可以使用sed:

sed -n '/variableStep chrom=chrM/,/10376   10/\!p' file | uniq 
1)
sed-n'/str1/,/str2/\!p'文件

2)
-n
-表示静音

3)
//,//p
-用于使用
\,获取str1和str2之间的节将获取所有文件,不包括str1和str2之间的部分


4)
uniq
-remove
“track type=wiggle\u 0 name=description=“
根据您的需求的一种可能解释(您希望删除包含
chrM
的块),删除行后的额外行将被写入两次,这将在任何UNIX框上的任何shell中使用任何awk:

$ cat tst.awk
/^track/ { track=$0 ORS; next }
/chrom/  { f=(/chrM/ ? 1 : 0) }
!f { print track $0; track="" }


您选择移除该块的标准是什么?第四个块,最后第二个块,包含chrM的块,或其他什么?在cygwin上的bash中使用GNU sed 4.4-
sed:-e expression#1,char 67:未知命令:
\'`。此外,如果chrM块是文件中的最后一个块,那么这种常规方法也会失败。多亏了Ed Morton,我已经修复了它:)不客气,但它仍然会生成语法错误-
$sed-n'/variableStep chrom=chrM/,/10376 10/\!p'文件
->
sed:-e表达式#1,字符39:未知命令:'\'
。显然,它现在也依赖于出现在chrM块末尾的
10376 10
,而不是出现在chrM块的其他地方,所以YMMV。你不应该逃避
,这就是导致错误的原因。你在用csh吗?在csh中,你必须逃离它。在Bash中,您不需要这样做。解释是正确的。但是我得到以下错误-bash:!f:未发现事件我完全按照您所写的做了,但我仍然收到相同的错误。命令中的感叹号?可以放吗!在bash-like(!f)中,我编辑了这个问题。请查收。我肯定这是我的错,但是什么?谢谢你,艾德,我真傻。我应该注意到猫不是那样工作的(
$ awk -f tst.awk file
track type=wiggle_0 name= description=
variableStep chrom=chr1
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr2
10203   3
10213   4
10223   5
10233   5
10263   3
10366   6
10376   10
track type=wiggle_0 name= description=
variableStep chrom=chr3
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
track type=wiggle_0 name= description=
variableStep chrom=chrX
10203   3
10213   4
10223   5
10233   5
10243   4
10253   3
10263   3
10366   6
10376   10