データを収集し、次の形式で「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番目の列を印刷できます-F
。awk
:
>
awk
この出力はこの出力にパイプされ、xargs
8つの列に再構成されます。最後に、このコマンドは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 つの引数が少なくなります。これにより、スクリプトが停止する構文エラーが発生します。しかし、なぜ構文エラーメッセージが表示されないのかわかりません。
これらの修正にもかかわらず、このコードはまだ特に脆弱です。フォーマットを少し変更してもエラーが発生する可能性があります。