我无法想到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
答案 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="
额外行将被写入两次