ファイルで重複したタグインスタンスを見つける

ファイルで重複したタグインスタンスを見つける

ファイルには、次のようないくつかのコードスニペットがあります。

<blah>Spread the peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> on good looking bread <ramout assot="f0123_fun10" bapel="3 or 5"/> that does not have peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> already on the bread this that and the other <ramout assot="f0123_fun10" bapel="4"/> with something else.</blah>

単一のファイル内で ramout タグの重複インスタンスを見つけようとします。次の条件が存在する場合:

<ramout assot="f0123_fun10" bapel="2 or 6"/> 

最初と終わりの空腹タグで再度繰り返されるかどうか疑問に思います。

いくつかの方法を試しましたが、最新の方法の1つは次のとおりです。

grep -Eoi '<blah>.*([[:space:]]<ramout assot).*\1.*</blah>' *.xml | less

何も返されません。

私も次のことを試しました。

 grep -Eio '<blah>.*([[:space:]]<ramout assot="[a-z][0-9]{5}_fig[0-9]+" bapel="[0-9]+.*)' *.xml

逆参照は含まれませんが、すべての結果が表示されるわけではありません。これは1つの行の結果のみを表示するようです(複数の行にまたがっていません)。

1行にある場合とない場合があるものを検索するには、sedを使用する必要がありますか?

awkが実行可能な候補ですか?見てみました。 awk '/Startpattern/,/Endpattern/' filename はより多くの結果を返しましたが、それでもすべて取得できませんでした。

a) ファイル全体のすべての結果と個別に b) blah タグ内で繰り返されるすべての結果を見つけるのを手伝ってくれてありがとう。

予想される結果は次のようになります。

検索結果a)すべてのRamout結果を表示:

<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="3 or 5"/>
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/>

b) 重複結果を表示する検索結果は次のとおりです。

<ramout assot="f0123_fun10" bapel="2 or 6"/>

答え1

使用XMLスター(時々インストールされるxmlstarletことがありますxml)関連タグを抽出し、重複する項目をsort見つけますuniq

$ xml sel -t -m '/blah/ramout' -c '.' -nl test.xml | sort | uniq -d
<ramout assot="f0123_fun10" bapel="2 or 6"/>

このコマンドは、このタグの直下のすべてのタグをxml一致させ、各タグを標準出力にコピーしてから改行文字をコピーします。<ramout><blah>

sortuniq -dの出力で重複する項目をソートして抽出しますsort

答え2

私のテストでは、次のことがうまくいきます。

awk -F"/>" -v RS="<ramout assot=" 'NR>1{print RS $1 FS}' file1

echo "Finding Cuplicates:"
awk -F"/>" -v RS="<ramout assot=" 'NR==1{next}seen[$1]++==1{print RS $1 FS}' file1

<ramout assot="f0123_fun10" bapel="2 or 6"/> 
<ramout assot="f0123_fun10" bapel="3 or 5"/> 
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/> 
Finding Cuplicates:              
<ramout assot="f0123_fun10" bapel="2 or 6"/>  

ここでオンラインでテストしてみてください。

awk機能を使用して、カスタムレコード区切り文字(RS)とカスタムフィールド区切り文字(FS)を宣言します。上記の2つのコマンドを1つのawkにまとめることができます。これは単なるテストです。

関連情報