Search code examples
text-processing

Is there a way to extract each matching result of a sed script to a file each?


I have a file structured like the one below, only with more sections:

SCN DD1251       At Glasgow Road - Kilbowie Road                                
Modified                   By ________                                          
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      C           DD1271    R                                     
        DD1351      D           DD1351    B                                     
                    E                                                           
                                                                                
SCN DD1271       At Glasgow Road - Hume Street                                  
Modified 13-OCT-15 15:06   By BDAVIDSON                                         
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1301      T           DD1301    A                                     
        DD1251      R           DD1251    C                                     
                                                                                
SCN DD1301       At Glasgow Road - Argyll Road - Cart Street                    
Modified 27-JUN-16 11:45   By BDAVIDSON                                         
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      A           DD1271    T                                     
                    B                                                           
                    C                                                           
                    D                                                           
                                                                                
SCN DD1351       At Kilbowie Road - Chalmers Street                             
Modified  9-FEB-21 08:57   By BDAVIDSON                                         
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
                    A           DD1251    D                                     
        DD1251      B                                                           
                    C                                                           
                                                                                
SCN DD1451       At Kilbowie Road - Montrose Street                             
Modified  9-FEB-21 08:58   By BDAVIDSON                                         
Type CR                                                                         
Region  WC  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
                    A                                                           
                    B                                                           
                    C                                                           
                                                                                
SCN DD1601       At Kilbowie Road - Thomson Street 3G                           
Modified  9-FEB-21 08:59   By BDAVIDSON                                         
Type CR                                                                         
Region  WV  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
                    A                                                           
                    B                                                           
                    C                                                           
                    D                                                           
                                                                                
SCN DD1621       At Argyll Road - Stanford Street 3G                            
Modified  9-FEB-21 08:59   By BDAVIDSON                                         
Type CR                                                                         
Region  AS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
                    B                                                           
                    C                                                           
                    D                                                           
                                                                                

Currently, I am using the following bash script containing a sed function to pull out each section of data from one SCN to the line of no characters between entires:

sed -n '/^SCN/,/^\s*$/p' LOG.TXT > Junction-Links.txt

This produces the following output:

SCN DD1251       At Glasgow Road - Kilbowie Road                                
Modified                   By ________                                          
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      C           DD1271    R                                     
        DD1351      D           DD1351    B                                     
                    E                                                           
                                                                                
SCN DD1271       At Glasgow Road - Hume Street                                  
Modified 13-OCT-15 15:06   By BDAVIDSON                                         
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1301      T           DD1301    A                                     
        DD1251      R           DD1251    C                                     
                                                                                

My question is, is it possible to save each matching pattern to a separate file (i.e a file for SCN DD1251, a file for SCN DD1271 etc.) rather than saving them all into one combined file?

Ideally the output would be like so:

  • SCN DD1251.txt
  • SCN DD1271.txt
  • SCN DD1301.txt
  • SCN DD1351.txt

With SCN DD1251.txt simply containing the following:

SCN DD1251       At Glasgow Road - Kilbowie Road                                
Modified                   By ________                                          
Type CR                                                                         
Region  WS  Subregion                                                           
            UPSTREAM               DOWNSTREAM               FILTER              
          NODE     LINK          NODE    LINK                LINK               
        DD1271      C           DD1271    R                                     
        DD1351      D           DD1351    B                                     
                    E                                                        

Solution

  • Using any awk in any shell on every Unix box:

    $ awk '/^SCN/{close(out); out=$1" "$2".txt"} {print > out}' file
    

    $ head SCN*
    ==> SCN DD1251.txt <==
    SCN DD1251       At Glasgow Road - Kilbowie Road
    Modified                   By ________
    Type CR
    Region  WS  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
            DD1271      C           DD1271    R
            DD1351      D           DD1351    B
                        E
    
    
    ==> SCN DD1271.txt <==
    SCN DD1271       At Glasgow Road - Hume Street
    Modified 13-OCT-15 15:06   By BDAVIDSON
    Type CR
    Region  WS  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
            DD1301      T           DD1301    A
            DD1251      R           DD1251    C
    
    
    ==> SCN DD1301.txt <==
    SCN DD1301       At Glasgow Road - Argyll Road - Cart Street
    Modified 27-JUN-16 11:45   By BDAVIDSON
    Type CR
    Region  WS  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
            DD1271      A           DD1271    T
                        B
                        C
                        D
    
    ==> SCN DD1351.txt <==
    SCN DD1351       At Kilbowie Road - Chalmers Street
    Modified  9-FEB-21 08:57   By BDAVIDSON
    Type CR
    Region  WS  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
                        A           DD1251    D
            DD1251      B
                        C
    
    
    ==> SCN DD1451.txt <==
    SCN DD1451       At Kilbowie Road - Montrose Street
    Modified  9-FEB-21 08:58   By BDAVIDSON
    Type CR
    Region  WC  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
                        A
                        B
                        C
    
    
    ==> SCN DD1601.txt <==
    SCN DD1601       At Kilbowie Road - Thomson Street 3G
    Modified  9-FEB-21 08:59   By BDAVIDSON
    Type CR
    Region  WV  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
                        A
                        B
                        C
                        D
    
    ==> SCN DD1621.txt <==
    SCN DD1621       At Argyll Road - Stanford Street 3G
    Modified  9-FEB-21 08:59   By BDAVIDSON
    Type CR
    Region  AS  Subregion
                UPSTREAM               DOWNSTREAM               FILTER
              NODE     LINK          NODE    LINK                LINK
                        B
                        C
                        D