XML 파일의 특정 태그 내에서 중복 줄을 제거하는 방법

XML 파일의 특정 태그 내에서 중복 줄을 제거하는 방법

다음과 같은 파일이 있다고 가정해 보겠습니다.

...
<tag2>
    a
    b
    c
    a
</tag2>
...
<tag2>
    x
    y
    y
    z
    x    
</tag2>

<tag2>아래 예와 같이 각 행에서 중복 행을 제거하려면 어떻게 해야 합니까 ?

...
<tag2>
    a
    b
    c
</tag2>
...
<tag2>
    x
    y   
    z
</tag2>

디렉터리와 하위 디렉터리의 모든 파일을 검색하고 이러한 중복 항목을 제거하고 싶습니다.

답변1

XSLT 2.0 솔루션:

<xsl:template match="tag2">
  <tag2>
    <xsl:value-of select="distinct-values(tokenize(., '&#xa;'))"/>
  </tag2>
</xsl:template>

답변2

파일이 얼마나 복잡한지는 잘 모르겠지만 주어진 예에서는 이것이 작동하는 것 같습니다.

$ awk '/^<[a-z]/{print;delete z}!/^</{z[$0]=1}/^<\//{for(x in z){print x}print}' file1
<tag2>
    a
    b
    c
</tag2>
<tag2>
    x
    y
    z
</tag2>
$

해설

awk '/^<[a-z]/ {         # If start tag
         print           #     Print line
         delete z        #     Clear array
     } !/^</ {           # If not a tag
         z[$0]=1         #     Store line
     } /^<\// {          # If end tag
         for(x in z) {   #     For each array entry
             print x     #         Print array entry
         }
         print           #     Print end tag
     }' file1

관련 정보