删除文件的一部分

时间:2018-02-06 11:39:23

标签: 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= 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 and 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

4 个答案:

答案 0 :(得分:1)

基于对您的要求的一种可能解释(您要删除包含chrM的块),这将在任何UNIX框上的任何shell中使用任何awk:

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

$ 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

答案 1 :(得分:0)

您可以使用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

答案 2 :(得分:0)

统一 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

答案 3 :(得分:0)

您可以使用 sed

sed -n '/variableStep chrom=chrM/,/10376   10/\!p' file | uniq 

1)sed -n '/str1/,/str2/\!p' file

2)-n - 用于沉默

3)//,//p - 用于获取str1和amp;之间的部分使用 \! 的str2将获取除str1和&amp;之间的所有文件之外的所有文件。 str2

4)uniq - 删除行后删除"track type=wiggle_0 name= description="额外行将被写入两次