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は残りのファイルをstdoutに出力します)

編集:これはあなたの場合にも機能します:

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 に答える