srinath
srinath

Reputation: 91

Perl script to skip a line

I have YAML file as input. In input file, I have sales and sales($) rows. I need to take only one row as output.
Logic:

  1. if sales($) row is present then we need to take this row.
  2. If Both Sales($) and Sales rows are present then we need sales($) row.
  3. If Sales row is present then we need sales row.(Only if sales row present)

Can anyone guide how to achieve this perl 5?

My Input File Looks like...

---
Order ID: W00875205405667
Sales($): '7.5'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405668
Sales: '74.50'
Sales($): '72.5'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405669
Sales: '12.50'
Transaction Datetime: 2015-03-29 16:17:00
---

Need Output File as:

---
Order ID: W00875205405667
Sales: '7.5'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405668
Sales: '72.50'
Transaction Datetime: 2015-03-29 16:17:00
---
Order ID: W00875205405669
Sales: '12.50'
Transaction Datetime: 2015-03-29 16:17:00
---

Upvotes: 0

Views: 68

Answers (1)

user557597
user557597

Reputation:

You could preference the sales($) and use just a single capture buffer
with a Branch Reset construct (?|,,)

 # /(?m)^Order\h+ID:\h*(.*)\s+(?|(?:^.*\s+)?^Sales\(\$\):\h*(.*)\s+|^Sales:\h*(.*)\s+)^Transaction\h+Datetime:\h*(.*)/

 (?m)
 ^ Order \h+ ID: \h* 
 ( .* )                        # (1)
 \s+ 
 (?|
      (?: ^ .* \s+ )?
      ^ Sales\(\$\): \h* 
      ( .* )                        # (2)
      \s+ 
   |  
      ^ Sales: \h* 
      ( .* )                        # (2)
      \s+ 
 )
 ^ Transaction \h+ Datetime: \h* 
 ( .* )                        # (3)

Output:

 **  Grp 0 -  ( pos 0 , len 85 ) 
Order ID: W00875205405667
Sales($): '7.5'
Transaction Datetime: 2015-03-29 16:17:00  
 **  Grp 1 -  ( pos 10 , len 15 ) 
W00875205405667  
 **  Grp 2 -  ( pos 37 , len 5 ) 
'7.5'  
 **  Grp 3 -  ( pos 66 , len 19 ) 
2015-03-29 16:17:00  

-------------------

 **  Grp 0 -  ( pos 92 , len 102 ) 
Order ID: W00875205405668
Sales: '74.50'
Sales($): '72.5'
Transaction Datetime: 2015-03-29 16:17:00  
 **  Grp 1 -  ( pos 102 , len 15 ) 
W00875205405668  
 **  Grp 2 -  ( pos 145 , len 6 ) 
'72.5'  
 **  Grp 3 -  ( pos 175 , len 19 ) 
2015-03-29 16:17:00  

-------------------

 **  Grp 0 -  ( pos 201 , len 84 ) 
Order ID: W00875205405669
Sales: '12.50'
Transaction Datetime: 2015-03-29 16:17:00  
 **  Grp 1 -  ( pos 211 , len 15 ) 
W00875205405669  
 **  Grp 2 -  ( pos 235 , len 7 ) 
'12.50'  
 **  Grp 3 -  ( pos 266 , len 19 ) 
2015-03-29 16:17:00  

Upvotes: 1

Related Questions