例の出力に従う必要があります。
<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. スペースを区切り文字として使用すると、列が正しくソートされません。