5

awk を使用して複数行の式を解析しようとしています。そのうちの 1 つは次のようになります。

_begin  hello world !
_attrib0    123
_attrib1    super duper
_attrib1    yet another value
_attrib2    foo
_end

_begin と _attrib1 に関連付けられた値を抽出する必要があります。したがって、この例では、awk スクリプトは次の値を返します (1 行に 1 つ):

hello world ! super duper yet another value 

使用される区切り文字はタブ (\t) 文字です。スペースは文字列内でのみ使用されます。

4

2 に答える 2

8

次の awk スクリプトがその役割を果たします。

#!/usr/bin/awk -f
BEGIN { FS="\t"; }
/^_begin/      { output=$2; }
$1=="_attrib1" { output=output " " $2; }
/^_end/        { print output; }

\tタブ ( ) を出力フィールド区切り記号にするかどうかを指定していません。もしそうなら、私に知らせてください。答えを更新します。(またはできます。それは簡単です。)

もちろん、恐ろしい代替手段が必要な場合 (ハロウィーンが近づいているため)、次を使用したソリューションを次に示しますsed

$ sed -ne '/^_begin./{s///;h;};/^_attrib1[^0-9]/{s///;H;x;s/\n/ /;x;};/^_end/{;g;p;}' input.txt 
hello world ! super duper yet another value

これはどのように作動しますか?ムワハハ、聞いてよかった。

  • /^_begin./{s///;h;};-- が表示されたら_begin、それを取り除き、残りの行を sed の「ホールド バッファ」に格納します。
  • /^_attrib1[^0-9]/{s///;H;x;s/\n/ /;x;};-- が表示されたら_attrib1、それを取り除き、ホールド バッファに追加し、ホールド バッファとパターン スペースを交換し、改行をスペースに置き換え、ホールド バッファとパターン スペースを再び交換します。
  • /^_end/{;g;p;}-- 最後に到達したので、ホールド バッファをパターン スペースにプルして出力します。

これは、入力フィールド区切りが単一のタブであることを前提としています。

とても簡単。誰sedが難解だと言った?!

于 2012-10-30T17:36:36.277 に答える
1

これはうまくいくはずです:

#!/bin/bash 

awk 'BEGIN {FS="\t"} {if ($1=="_begin" || $1=="_attrib1") { output=output " " $2 }} END{print output}'
于 2012-10-30T17:44:41.107 に答える