2

我对 sed 很熟悉,但对 awk 不是很了解,也不知道如何解决这个问题。我已经用谷歌搜索了一段时间,但到目前为止还没有运气。情况如下:我有一个包含组和部分的大文件,如下所示:

<A1>
  some nr of lines
</A1>
<A2>
  some nr
  of lines
</A2>
<B1>
  some
  nr of
  lines
</B1>
<B2>
  some nr of lines
</B2>
<B3>
  bla
</B3>
<C1>
  bla
</C1>
<C2>
  bla
</C2>

现在的问题是组数可以改变,段数可以改变,每个段的行数可以改变。例如,A 部分可能会达到 25,B 部分可能会达到 8,依此类推。我需要做的是删除某些组的所有条目,在上面的示例中,我想删除 中的所有内容<B*>,留下以下内容:

<A1>
  some nr of lines
</A1>
<A2>
  some nr
  of lines
</A2>
<C1>
  bla
</C1>
<C2>
  bla
</C2>

此外,我想删除几个部分(尽管这些部分可以单独运行),例如,如果文件从 A1 转到 R123,我想删除 B*、F*、M* 等。

如果已经在某处询问并回答了类似的问题,我深表歉意,我确实在发布之前尝试找到解决方案。

谢谢!

4

2 回答 2

6

使用 sed:

sed '/<B1>/,/<\/B3>/d' infile

这意味着找到从 sed 开始<B1>和结束于的文本范围</B3>并将其从 sed 的输出中删除。(这意味着 sed 将在标准输出上打印文件的其余部分)

编辑:这也适用于您的情况:

sed '/<B[0-9]*>/,/<\/B[0-9]*>/d' 
于 2012-12-10T20:59:11.980 回答
1

我认为你正在寻找的是这样的:

awk -v rmv="AC" 'BEGIN{
   gsub(/./,"|&",rmv)
   sub(/$/,")[0-9]+>$",rmv)
   start = end = rmv
   sub(/^\|/,"^<(",start)
   sub(/^\|/,"^</(",end)
}
$0 ~ start { f=1 }
!f
$0 ~ end   { f=0 }
' file

Just populate the "rmv" variable with the list of all the sections you want removed:

$ awk -v rmv="B" '...'
<A1>
  some nr of lines
</A1>
<A2>
  some nr
  of lines
</A2>
<C1>
  bla
</C1>
<C2>
  bla
</C2>
$ awk -v rmv="AC" '...'
<B1>
  some
  nr of
  lines
</B1>
<B2>
  some nr of lines
</B2>
<B3>
  bla
</B3>
$
于 2012-12-10T21:24:27.167 回答