2017-04-04 19 views
0

複数のファイルから複数のタグ値を抽出する必要があります。我々は、単一のファイルにすべてのファイルからEMPNAME、SidNumberとEpisodeIdを抽出する必要がlinuxの複数のxmlファイルから複数のタグ値を抽出する方法

<Employee> 
     <Id>432361</Id> 
     <EmpName>Stuart</EmpName> 
     <SidNumber>0251115</SidNumber> 
     <CreatedUtc>2016-11-14T22:27:53.477+08:00</CreatedUtc> 
     <EpisodeId>682082</EpisodeId> 
     <CorrelationId>323A6C86-76AA-E611-80DA-005056B46023</CorrelationId> 
    </Employee> 

: は、我々は次のようにデータを持つ約1000のファイルを持っています。 私たちは一度に1つの値を得ることができます。コマンドを使用して:

nawk -F'[<>]' '/<EpisodeId>/{print $3}' *.dat 

しかし、我々は、各ファイルの複数のタグを取得する必要があります。 出力形式が

EmpName Stuart SidNumber 0251115 EpisodeId 682082 
EmpName Stuart SidNumber 0251115 EpisodeId 682082 

または少なくともスペース区切りのようなものであるべき値

Stuart 0251115 682082 
Stuart 0251115 682082 

任意の助けいただければ幸いです。事前に

おかげで、 のVivek

+3

は 'sed'や' awk'には向いていませんが、仕事のためのツールではありません。 'xmllint'のようなxml対応のツールに行くと、ここではやってはいけない方法の一つですが、小さなxmlの場合はうまくいくでしょう。 '$(awk -v FS = '[<数>]'長さ($ 3){プリント$ 2" = "$ 3}"入力ファイル) 'エコー$ EmpName' –

答えて

1

これを試してみてください - (f2.txt f1.txt 2つのサンプルファイルを作成した)

$ head f?.txt 
==> f1.txt <== 
<Employee> 
     <Id>432361</Id> 
     <EmpName>Stuart</EmpName> 
     <SidNumber>0251115</SidNumber> 
     <CreatedUtc>2016-11-14T22:27:53.477+08:00</CreatedUtc> 
     <EpisodeId>682082</EpisodeId> 
     <CorrelationId>323A6C86-76AA-E611-80DA-005056B46023</CorrelationId> 
    </Employee> 

==> f2.txt <== 
<Employee> 
     <Id>432361</Id> 
     <EmpName>vipin</EmpName> 
     <SidNumber>0251117</SidNumber> 
     <CreatedUtc>2016-12-14T22:27:53.477+08:00</CreatedUtc> 
     <EpisodeId>682082</EpisodeId> 
     <CorrelationId>323A6C86-76AA-E611-80DA-005056B46023</CorrelationId> 
    </Employee> 

処理...

$ for i in f?.txt;do awk -F'[<>]' '/EmpName|SidNumber|EpisodeId/{printf $3OFS} END {print ""}' $i;done 
Stuart 0251115 682082 
vipin 0251117 682082 

適切な書式付き出力のために -

あなたが列cmdが利用できていない場合は
$ for i in f?.txt;do awk -F'[<>]' '/EmpName|SidNumber|EpisodeId/{printf $3OFS} END {print ""}' $i;done|column -t 
Stuart 0251115 682082 
vipin 0251117 682082 

あなたに、cmdの下に試すことができます -

for i in f?.txt;do awk -F'[<>]' '/EmpName|SidNumber|EpisodeId/{printf "%-10s", $3OFS} END {print ""}' $i;done 
Stuart 0251115 682082  
vipin  0251117 682082 

我々は列の値をフォーマットすることができAWKのprintf関数で。

+0

ありがとうVipin、あなたは私の問題を解決しました。可能であれば、もう1つの質問があります。私のシェルでは、 "bash:column:command not found"と表示されています。出力をフォーマットするための選択肢はありますか? –

+0

@VivekVishal - あなたの必要に応じて私の答えを更新しました。どうぞよろしくお願いします。 '' –

+0

Vipinありがとう、本当にありがとうございます –

0
nawk -F'[<>]' '/<EmpName>|<SidNumber>|<EpisodeId>/{print $3}' *.dat 
+0

道徳がありますか? EmpNameのような書式設定された出力を得るためにStuart Stuart 0251115 EpisodeId 682082 –

+0

"あなたの答えは確かに少し説明する価値があります。参考にしてくださいhttp://stackoverflow.com/help/how-to-answer。コメントは検索可能なコンテンツを作成するのに役立ちます。 " –

関連する問題