Sponsored Content
Top Forums Shell Programming and Scripting Moving XML tag/contents after specific XML tag within same file Post 303021756 by stomp on Thursday 16th of August 2018 09:26:02 AM
Old 08-16-2018
Rant

Well. I'm always interested in competing to awk with other languages. I obviously can not compete in brevity(which is very impressive, when I see the solutions presented in this forum - but they may twist my brains sometimes which seems a horror to me, when coming back to a solution: WTF did I think, when I wrote that pile of crazy code?) so far, but I try to do in maintainability, efficiency(IO-request and memory economy) and runtime speed:

I don't know if you even are able to use ruby, but here's my suggestion in ruby(Just for the fun of learning).


/Rant


Code:
#!/usr/bin/env ruby

$handle = File.open(ARGV[0],"r")
$current_line = ""

$ah     ="^\s*<accountHolderName>.*<\/accountHolderName>\s*\n"
$aah    ="^\s*<additionalaccountHolders>.*<\/additionalaccountHolders>\s*\n"

def chunks()     
        Enumerator.new do |chunk|
             loop do
                     new = get_chunk()
                     if !new then break end
                     chunk << new
              end
        end
end

def get_chunk()
        while !$handle.eof do
                current_chunk = ( current_chunk ? current_chunk : "") + $current_line
                $current_line = $handle.readline
                if $current_line.match(/holder>/) then
                        return current_chunk
                end
        end
        return current_chunk
end

def reorder(chunk)
        ah_current=chunk.match(/(#{$ah})/im)
        aah_current=chunk.match(/#{$aah}/im)
        chunk.gsub!(/#{$aah}/im,"")
        chunk.gsub!(/#{$ah}/,"#{ah_current}#{aah_current}")
        return chunk
end

chunks.each {|c| puts reorder(c)}

Use it like this:

Code:
reorder.rb data.xml

------ Post updated at 01:56 PM ------

Or here with OOP:

Code:
#!/usr/bin/env ruby

class ChunkCollection
        def initialize(file)
                @handle = File.open(file,"r")
                @current_line=@data=""
        end
        def chunks()
                Enumerator.new do |c|
                     loop do
                             if data = get_chunk() then
                                     c << Chunk.new(data) 
                             else 
                                     break
                             end
                      end
                end
        end
        def get_chunk()
                while !@handle.eof do
                        current_chunk = ( current_chunk ? current_chunk : "") + @current_line
                        @current_line = @handle.readline
                        return current_chunk if @current_line.match(/holder>/) 
                end
        end
        def reorder() 
                chunks.each {|c| @data+=c.reorder()}
                return self
        end
        def show() puts @data end
end     

class Chunk
        def initialize(data) 
                @ah     ="^\s*<accountHolderName>.*<\/accountHolderName>\s*\n"
                @aah    ="^\s*<additionalaccountHolders>.*<\/additionalaccountHolders>\s*\n"
                @chunk = data
        end
        def reorder()
                ah_current=@chunk.match(/(#{@ah})/im)
                aah_current=@chunk.match(/#{@aah}/im)
                return @chunk.gsub(/#{@aah}/im,"").
                        gsub(/#{@ah}/,"#{ah_current}#{aah_current}")
        end
end

ChunkCollection.new(ARGV[0]).reorder.show

------ Post updated at 03:26 PM ------

I would suggest this little change to vgersh solution:


Quote:
Originally Posted by vgersh99
------ Post updated at 06:23 PM ------
Code:
awk '
  /<accountHolderName/ {accH=FNR}
  FNR==NR {
     if (/<AdditionalAccountHolders/) {s[accH]=(s[accH])?s[accH] ORS $0:$0;f++;next}
     if (f) s[accH]= s[accH] ORS $0
     if (/<[/]AdditionalAccountHolders/) f--
     next
  }
  /<accountHolderName/ && s[accH] {print $0 ORS s[accH];next}
  /<AdditionalAccountHolders/,/<[/]AdditionalAccountHolders/ {next}
  1' myXMLfile myXMLfile


Edit

My change is not needed. Even the umodified version prior to the input data specification change (without f++ but f=1) works.


And well: That awk solution is not really that complicated.... Smilie

Last edited by stomp; 08-16-2018 at 10:40 AM..
 

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

how to get specific xml tag ?

sorry to trouble u guys again... i have this document here called record.txt and it contains this: 2005-12-05 10:53:17,551 INFO - message received... 2005-12-05 10:53:17,557 INFO - The XML message **************<berth_allocation xmln... (13 Replies)
Discussion started by: forevercalz
13 Replies

2. Shell Programming and Scripting

Extracting XML Tag Contents

Hi Jean I require your help in writing a shell script. Iam zero in Unix programming. I have a large file about 400 MB of data, which contains about 50000 XML messages seperated by a Tab, I think. I need to extract only 4 values from each XML message and write it onto a new file. Please help me... (2 Replies)
Discussion started by: pk_eee
2 Replies

3. Shell Programming and Scripting

XML tag replacement from different XML file

We have 2 XML file 1. ORIGINAL.xml file and 2. ATTRIBUTE.xml files, In the ORIGINAL.xml we need some modification as <resourceCode>431048</resourceCode>under <item type="Manufactured"> tag - we need to grab the 431048 value from tag and pass it to database table in unix shell script to find the... (0 Replies)
Discussion started by: balrajg
0 Replies

4. Shell Programming and Scripting

how to retrieve specific parameters using a xml tag

Hi, I have the following code in my xml file: <aaaRule loginIdPattern=".*" orgIdPattern=".*" deny="false" /> <aaaRuleGroup name="dpaas"> <aaaRule loginIdPattern=".*" orgIdPattern=".*" deny="false" /> I want to retrieve orgIdPattern and loginIdPattern parameter value based on... (2 Replies)
Discussion started by: mjavalkar
2 Replies

5. Shell Programming and Scripting

How to retrieve the value from XML tag whose end tag is in next line

Hi All, Find the following code: <Universal>D38x82j1JJ </Universal> I want to retrieve the value of <Universal> tag as below: Please help me. (3 Replies)
Discussion started by: mjavalkar
3 Replies

6. Shell Programming and Scripting

How to add the multiple lines of xml tags before a particular xml tag in a file

Hi All, I'm stuck with adding multiple lines(irrespective of line number) to a file before a particular xml tag. Please help me. <A>testing_Location</A> <value>LA</value> <zone>US</zone> <B>Region</B> <value>Russia</value> <zone>Washington</zone> <C>Country</C>... (0 Replies)
Discussion started by: mjavalkar
0 Replies

7. Shell Programming and Scripting

XML Parse between to tag with upper tag

Hi Guys Here is my Input : <?xml version="1.0" encoding="UTF-8"?> <xn:MeContext id="01736"> <xn:VsDataContainer id="01736"> <xn:attributes> <xn:vsDataType>vsDataMeContext</xn:vsDataType> ... (12 Replies)
Discussion started by: pareshkp
12 Replies

8. Shell Programming and Scripting

To search for a particular tag in xml and collate all similar tag values and display them count

I want to basically do the below thing. Suppose there is a tag called object1. I want to display an output for all similar tag values under heading of Object 1 and the count of the xmls. Please help File: <xml><object1>house</object1><object2>child</object2>... (9 Replies)
Discussion started by: srkmish
9 Replies

9. UNIX for Beginners Questions & Answers

Grepping multiple XML tag results from XML file.

I want to write a one line script that outputs the result of multiple xml tags from a XML file. For example I have a XML file which has below XML tags in the file: <EMAIL>***</EMAIL> <CUSTOMER_ID>****</CUSTOMER_ID> <BRANDID>***</BRANDID> Now I want to grep the values of all these specified... (1 Reply)
Discussion started by: shubh752
1 Replies
All times are GMT -4. The time now is 05:56 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy