awkまたはsedを使用してファイルから複数の情報を抽出する

awkまたはsedを使用してファイルから複数の情報を抽出する

次のログファイルを生成するプログラムがあります。

    Player: 9.8.7.6.5.4.3.2.1 () Item: 10/gold/tool//onehanded///, 15/gold/tool//twohanded
    Player: 8.7.6.5.4.3.2.1.9 () Item: 20/diamond/tool//twohanded///
    Player: 7.6.5.4.3.2.1.9.8 () Item: 30/copper/tool//onehanded///, 36/gold/tool//twohanded///
    Player: 6.5.4.3.2.1.9.8.7 () Item: 40/gold/tool//twohanded///
    Player: 5.4.3.2.1.9.8.7.6 () Item: 50/gold/tool//onehanded///, 55/gold/tool//twohanded///
    Player: 4.3.2.1.9.8.7.6.5 () Item: 10/gold/tool//onehanded///, 12/diamond/tool//twohanded///
    ...

ログファイルは引き続き表示されます。私が必要とするのは、すべての出力を印刷することですプレイヤー次のツールを持って, とともにIDツールの。たとえば、次のものが必要です。

Player: 9.8.7.6.5.4.3.2.1;10;15
Player: 7.6.5.4.3.2.1.9.8;36
Player: 6.5.4.3.2.1.9.8.7;40
Player: 5.4.3.2.1.9.8.7.6;50;55
Player: 4.3.2.1.9.8.7.6.5;10

ご覧のとおり、プレイヤー 8.7.6.5.4.3.2.1.9 は、ゴールドツールがないため、出力には含まれません。

これまで私のコードは次のようになります。

grep "/gold" file | awk -F '[()]' '{print $1}'

次を生成します。

Player: 9.8.7.6.5.4.3.2.1
Player: 7.6.5.4.3.2.1.9.8
Player: 6.5.4.3.2.1.9.8.7
Player: 5.4.3.2.1.9.8.7.6
Player: 4.3.2.1.9.8.7.6.5

この問題を解決するには、上記のコードに何を追加する必要がありますか?

ベストアンサー1

GNU awkを使う:

$ gawk -F' \\(\\) ' '
    /gold\/tool/ {
      items = $2; ids=""; 
      while(match(items,/([0-9]+)\/gold\/tool/,a)) {
        ids = ids ";" a[1]; 
        items = substr(items,RSTART+RLENGTH+1)
      } 
      print $1 ids
    }' file
    Player: 9.8.7.6.5.4.3.2.1;10;15
    Player: 7.6.5.4.3.2.1.9.8;36
    Player: 6.5.4.3.2.1.9.8.7;40
    Player: 5.4.3.2.1.9.8.7.6;50;55
    Player: 4.3.2.1.9.8.7.6.5;10

おすすめ記事