垂直に収集されたデータをテーブルに変換

垂直に収集されたデータをテーブルに変換

データを収集し、次の形式で「data.txt」ファイルに保存しました。

<$ MG_nr>
</200>company-type:Engine1
</210>company-name:STR
</220>address:XX
</230>nr:4568789
</240>zipcode:08765
</250>place:ljkmljubi
</260>phone:786754678
</270>fax:76756778
</$>
<$ MG_nr>
</280>company-type:Engine2
</290>company-name:STR
</300>address:XX
</310>nr:7675678
</320>zipcode:87867
</330>place:jkhgkl
</340>phone:87865
</350>fax:876578
</$>
<$ MG_nr>
</360>company-type:Engine3
</370>company-name:STR
</380>address:XX
</390>nr:78675467
</400>zipcode:87657
</410>place:uiytryui
</420>phone:87656788976
</430>fax:8976535467
</$>
<$ MG_nr>
</440>company-type:Engine4
</450>company-name:STR
</460>address:XX
</470>nr:876578y67
</480>zipcode:786578
</490>place:kljhgryui
</500>phone:8976546789
</510>fax:989765
</$>

次のスプレッドシートに変更したいと思います。

Type         Name   Address   Nr      Zipcode Place     Phone       Fax
------------------------------------------------------------------------
Engine1      STR     XX      4568789  08765   ljkmljubi 786754678   76756778
Engine2      STR     XX      7675678  87867   jkhgkl    87865       876578
Engine3      STR     XX      78675467 87657   uiytryui  87656788976  8976535467
Engine4      STR     XX      87657867 786578  kljhgryui 8976546789 989765

私は次のコードを見つけてU & L site複製してみました。

#!/bin/bash
cut -d'>' -f 2 data.txt | awk -F: '
/^company-type:/{type[c]=$2}
/^company-name:/{name[c]=$2}
/^address:/{address[c]=$2}
/^nr:/{nr[c]=$2}
/^zipcode:/{zipcode[c]=$2}
/^place:/{place[c]=$2}
/^phone:/{phone[c]=$2}
/^Fax:/{fax[c]=$2;c++}
END {
 print "Type         Name   Address   Nr Zipcode Place Phone Fax"
 print "------------------------------------------------------------------------"
 for(x in type) {
  printf "%-10s %3d    %s      %s %s %s %s %s\n",
    substr(type[x],2),
    company-name[x],
    address[x],
    nr[x],
    zipcode[x],
    place[x]
    phone[x]
    fax[x]
 }
}' data.txt

しかし、これはうまくいきません。タイトルのみ印刷されます!

print "Type         Name   Address   Nr Zipcode Place Phone Fax"
 print "------------------------------------------------------------------------"

何が間違っているのかわかりませんか?

どんなアドバイスにも感謝します!または上記のコードを効率的かつ簡単にするための提案がありますか?

答え1

より簡単な解決策は次のとおりです。

awk -F'[>:]' 'BEGIN{print "company-type company-name address nr zipcode place phone fax"}{print $3}' data.txt | xargs -n8 | column -t

company-type  company-name  address  nr        zipcode  place      phone        fax
Engine1       STR           XX       4568789   08765    ljkmljubi  786754678    76756778
Engine2       STR           XX       7675678   87867    jkhgkl     87865        876578
Engine3       STR           XX       78675467  87657    uiytryui   87656788976  8976535467
Engine4       STR           XX       87657867  786578   kljhgryui  8976546789   989765

フィールド区切り文字は、ベース列のデータを読み取り、ヘッダーの構成中に必要な実際のデータと同じ3番目の列を印刷できます-Fawk:>awk

この出力はこの出力にパイプされ、xargs8つの列に再構成されます。最後に、このコマンドはcolumn結果列の間にタブと同じ間隔を追加します。

答え2

Goroは良い解決策を提供しますが、理解を深めるためにコードが正しく機能しないといういくつかの問題を指摘する必要があると思いました。

  • 変数のデータインデックスを収集しますcが、その値は変更しません。このコードでは、最後に読み取ったデータのみを取得できます。以前のデータはすべて上書きされます。この問題を解決する簡単な方法は/^company-type:/{type[c]=$2} に変更することです/^company-type:/{type[++c]=$2}
  • 会社タイプフィールドを印刷するときは、明確な理由なく最初の文字を削除します。substr(type[x],2),結果は「Engine1」ではなく「ngine1」です(実際に削除されたデータに印刷できない文字がないと仮定)。
  • これがおそらく出力が表示されない理由です。 place[x],phone[x] の後にコンマを追加する必要があります。 printf が place[x] の後にカンマを見つけることができない場合、これが最後の引数であると仮定して、 format ステートメントに必要な 8 つの引数より 2 つの引数が少なくなります。これにより、スクリプトが停止する構文エラーが発生します。しかし、なぜ構文エラーメッセージが表示されないのかわかりません。

これらの修正にもかかわらず、このコードはまだ特に脆弱です。フォーマットを少し変更してもエラーが発生する可能性があります。

関連情報