Bash 删除文件的一部分
在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
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