3

次の形式のハンドル文字列が必要です。

PREFIX_TYPE_N,DATA

では、*awk (gawk、mawk、nawk) は、既に一致した文字列のアクションにパターン マッチングを含めることをサポートしていますか? このようなもの(もちろん、私にはうまくいきません):

*awk 'BEGIN { FS="," }
     /PREFIX/ {
                /TYPE_1/  {printf "[TYPE1] [DATA: $2]"}    // <-- included pattern 
                /TYPE_2/  {printf "[TYPE2] [DATA: $2]"}    // <-- another included pattern
                ...                                        // <-- some more included patterns
              }' "filename"

それとも、if/else または switch/case が必要ですか?

4

2 に答える 2

3

それほどではありませんが、正規表現の一致演算子 (~) があるため、かなり似ています。

BEGIN { FS="," }
/PREFIX/ {
            if ($1 ~ "TYPE_1") {printf "[TYPE1] [DATA: $2]"}    // <-- included pattern 
            if ($1 ~ "TYPE_2") {printf "[TYPE2] [DATA: $2]"}    // <-- another included pattern
            ...                                        // <-- some more included patterns
          }

最初のパターン マッチは、1 行だけが処理された状態で既にそのブロックに入っているため、ブロック内に if のみを含めても問題ないことに注意してください。

パターンの読みやすさが本当に必要な場合は、次のようにすることができます。

BEGIN { FS="," }
/PREFIX/ { //stuff to do for all prefixes, before specific handling
          data = $2 }
/PREFIX_TYPE_1/ { type = "TYPE_1"; }
/PREFIX_TYPE_2/ { type = "TYPE_2"; }
/PREFIX/ { //stuff to do for all prefixes, after specific handling 
          printf("[%s] [DATA: $2]", type, data)
          }
于 2012-09-05T14:24:03.387 に答える
1

gawk では次のようにできます。

awk 'BEGIN { FS="," }
     /PREFIX/ {
                if (/TYPE_1/)  {printf "[TYPE1] [DATA: $2]"}    // <-- included pattern 
                if (/TYPE_2/)  {printf "[TYPE2] [DATA: $2]"}    // <-- another included pattern
                ...                                        // <-- some more included patterns
              }' "filename"

/TYPE_1/これは に相当します$0 ~ /TYPE_1/詳細については、ドキュメント(パート 6.1.2)を参照してください。

于 2012-09-05T14:30:50.777 に答える