awkを使用して行から列へ

awkを使用して行から列へ

例の出力に従う必要があります。

<HARDWARE>
    <NAME>WIN1</NAME>
    <OS>Windows 7</OS>
    <IP>1.2.3.4</IP>
    <DOMAIN>contoso.com</DOMAIN>
</HARDWARE>
<HARDWARE>
    <NAME>WIN2</NAME>
    <OS>Windows 8</OS>
    <IP>10.20.30.40</IP>
    <DOMAIN>contoso.com</DOMAIN>
</HARDWARE>

これを解析する最良の方法は次のとおりです。

WIN1    Windows 7    1.2.3.4     contoso.com
WIN2    Windows 8    10.20.30.40 contoso.com

awk、sedなどの標準ツールを使用するソリューションを探しています。

ベストアンサー1

XMLを少し変更し、すべてのXMLを親<DATA>タグ1または他の選択した名前付きファイルにラップしますdata.xml

<DATA>
<HARDWARE>
    <NAME>WIN1</NAME>
    <OS>Windows 7</OS>
    <IP>1.2.3.4</IP>
    <DOMAIN>contoso.com</DOMAIN>
</HARDWARE>
<HARDWARE>
    <NAME>WIN2</NAME>
    <OS>Windows 8</OS>
    <IP>10.20.30.40</IP>
    <DOMAIN>contoso.com</DOMAIN>
</HARDWARE>
</DATA>

xmlstarlet+使用column

 xmlstarlet sel -T -t -m /DATA/HARDWARE -v "concat(NAME,' ',OS,' ',IP,' ',DOMAIN)" -n data.xml | column -t 

以下を提供します。

WIN1  Windows  7  1.2.3.4      contoso.com
WIN2  Windows  8  10.20.30.40  contoso.com

編集する:

コメントと彼のコメントでPeter.Oの素晴らしいパフォーマンスに基づいて次のことに答えてください。次のようにパイプで区切られた2つのcolumn -ts$'|'出力をに送信します。

xmlstarlet sel --indent-tab -T -t -m /DATA/HARDWARE -v "concat(NAME,'|',OS,'|',IP,'|',DOMAIN)" -n data.xml | column -ts$'|'

これで、フィールドにスペースがあってもうまく整列します。

WIN1              Windows 7  1.2.3.4 release 5  contoso.com
Really long OS X  Windows 8  10.20.30.40        contoso.com

1.または{ echo '<DATA>'; cat file_name; echo '</DATA>'; } | xmlstarlet ... 以下のコメントでPeter.Oが指摘したとおりに使用してください。

2. スペースを区切り文字として使用すると、列が正しくソートされません。

おすすめ記事