awkを使用して複数のパターンを含む列を印刷する

awkを使用して複数のパターンを含む列を印刷する

awk複数のパターンを含む列を印刷する必要があります。列2と「config」と「service」を含むすべての列をそれぞれ印刷する必要があります。

文書の内容:

    build 345 java groovy /test:fail.txt /config:launcher.mxres /nickname:prod /service:session 
    auto 4986 java -xmx512 -d64 /test:pass.txt /nickname:deal /service:engine /config:launcher5.mxres
    build 912 binary.exe -f -t /test:code.txt /config:launcher_binary.mxres /service:scanner /nickname:input 

出力:

    345 /config:launcher.mxres /service:session
    4986 /config:launcher5.mxres /service:engine
    912 /config:launcher_binary.mxres /service:scanner

ベストアンサー1

次のawkスクリプトは各行のフィールド(列)を繰り返してフィールドを/config:検索します/service:。見つかったら、これらのフィールドの内容全体が変数に保存されます。

これらのフィールドを処理した後、スクリプトはループ内で見つかったフィールドだけでなく、2番目のフィールドのデータも出力します。その後、プロセスは次の行に進みます。

{
    config = service = "";

    for (i = 3; i <= NF; ++i) {
        if ($i ~ "^/config:") {
            config = $i;
        } else if ($i ~ "^/service:") {
            service = $i;
        }
    }

    print $2, config, service;
}

このスクリプトはテスト済みgawk(GNU awk)、mawk(Mike's awk)、nawk(BSD awk)で動作します。

指定したデータに対して次のコマンドを実行します。

$ awk -f script.awk data
345 /config:launcher.mxres /service:session
4986 /config:launcher5.mxres /service:engine
912 /config:launcher_binary.mxres /service:scanner

タブ区切りの出力が必要な場合は、BEGIN { OFS = "\t" }スクリプトの上部に追加してください。

...または元のスクリプトの出力を渡すことができますcolumn -t(列をソートする必要がある場合は、複数のスペースが挿入されます)。

$ awk -f script.awk data | column -t
345   /config:launcher.mxres         /service:session
4986  /config:launcher5.mxres        /service:engine
912   /config:launcher_binary.mxres  /service:scanner

一行で:

$ awk '{ config = service = ""; for (i = 1; i <= NF; ++i) { if ($i ~ "^/config:") { config = $i } else if ($i ~ "^/service:") { service = $i } } print $2, config, service }' data | column -t

おすすめ記事