Search code examples
unixawksedpastecut

How to extract group of strings and append it at the bottom of the file


Good day,

I have a file which displays like this:

Bin   1 = 5778    669  753  731  743  752  727  736  667    
Bin   5 =    2      2    0    0    0    0    0    0    0     Bin   7 =   63     36    5    1    1    5    1    5    9    
Bin   9 =    0      0    0    0    0    0    0    0    0     Bin  24 =    2      0    0    0    0    0    0    0    2    
Bin  31 =    0      0    0    0    0    0    0    0    0     Bin  47 =   28      2    4    6    1    2    5    3    5    
Bin  70 =    1      0    0    0    0    0    1    0    0     Bin  95 =    1      0    1    0    0    0    0    0    0    
Bin 120 =    1      0    1    0    0    0    0    0    0     Bin 121 =  162     49   13   11   10    3   10   12   54    
Bin 131 =    7      1    1    2    0    0    1    0    2     Bin 133 =    3      0    0    0    0    0    0    0    3    
Bin 141 =    6      0    0    0    1    0    1    2    2     Bin 560 =    1      0    0    0    1    0    0    0    0    
Bin 620 =    1      0    0    0    1    0    0    0    0     Bin 630 =    2      0    0    1    0    0    0    0    1    
Bin 1250 =    1     0    0    0    0    0    1    0    0     Bin 1410 =    1     0    1    0    0    0    0    0    0    
Bin 2004 =    1     0    0    0    0    0    0    1    0     Bin 2240 =    1     0    0    0    0    1    0    0    0    
Bin 2247 =    1     0    0    1    0    0    0    0    0     Bin 2300 =    1     0    0    0    0    1    0    0    0    
Bin 2309 =    1     0    0    0    1    0    0    0    0     Bin 2310 =    3     1    1    0    0    0    0    0    1    
Bin 2602 =    1     0    0    0    1    0    0    0    0    

I would like to cut the 2nd "Bin" pattern along with it's value on the right side and paste it at the bottom of the file and then sort it later. Appreciate your help on this problem of mine. Im just new in unix commands and still learning it. Thanks in advance.

I would like to have an output like this.

Bin   1 = 5778    669  753  731  743  752  727  736  667    
Bin   5 =    2      2    0    0    0    0    0    0    0     
Bin   7 =   63     36    5    1    1    5    1    5    9    
Bin   9 =    0      0    0    0    0    0    0    0    0     
Bin  24 =    2      0    0    0    0    0    0    0    2    
Bin  31 =    0      0    0    0    0    0    0    0    0     
Bin  47 =   28      2    4    6    1    2    5    3    5    
Bin  70 =    1      0    0    0    0    0    1    0    0     
Bin  95 =    1      0    1    0    0    0    0    0    0    
Bin 120 =    1      0    1    0    0    0    0    0    0     
Bin 121 =  162     49   13   11   10    3   10   12   54    
Bin 131 =    7      1    1    2    0    0    1    0    2     
Bin 133 =    3      0    0    0    0    0    0    0    3    
Bin 141 =    6      0    0    0    1    0    1    2    2     
Bin 560 =    1      0    0    0    1    0    0    0    0    
Bin 620 =    1      0    0    0    1    0    0    0    0     
Bin 630 =    2      0    0    1    0    0    0    0    1    
Bin 1250 =    1     0    0    0    0    0    1    0    0     
Bin 1410 =    1     0    1    0    0    0    0    0    0    
Bin 2004 =    1     0    0    0    0    0    0    1    0     
Bin 2240 =    1     0    0    0    0    1    0    0    0    
Bin 2247 =    1     0    0    1    0    0    0    0    0     
Bin 2300 =    1     0    0    0    0    1    0    0    0    
Bin 2309 =    1     0    0    0    1    0    0    0    0     
Bin 2310 =    3     1    1    0    0    0    0    0    1    
Bin 2602 =    1     0    0    0    1    0    0    0    0

regard,Mike


Solution

  • Short awk approach:

    awk 'NF>12{ $13= ORS $13 }1' file | column -t
    
    • NF - total number of fields

    • NF>12 - according to your expected result the maximal number of fields is 12. Non-whitespace sequence is treated as a field

    • $13= ORS $13 - breaking up the record at 13th field with record separator ORS (newline character)

    The output:

    Bin  1     =  5778  669  753  731  743  752  727  736  667
    Bin  5     =  2     2    0    0    0    0    0    0    0
    Bin  7     =  63    36   5    1    1    5    1    5    9
    Bin  9     =  0     0    0    0    0    0    0    0    0
    Bin  24    =  2     0    0    0    0    0    0    0    2
    Bin  31    =  0     0    0    0    0    0    0    0    0
    Bin  47    =  28    2    4    6    1    2    5    3    5
    Bin  70    =  1     0    0    0    0    0    1    0    0
    Bin  95    =  1     0    1    0    0    0    0    0    0
    Bin  120   =  1     0    1    0    0    0    0    0    0
    Bin  121   =  162   49   13   11   10   3    10   12   54
    Bin  131   =  7     1    1    2    0    0    1    0    2
    Bin  133   =  3     0    0    0    0    0    0    0    3
    Bin  141   =  6     0    0    0    1    0    1    2    2
    Bin  560   =  1     0    0    0    1    0    0    0    0
    Bin  620   =  1     0    0    0    1    0    0    0    0
    Bin  630   =  2     0    0    1    0    0    0    0    1
    Bin  1250  =  1     0    0    0    0    0    1    0    0
    Bin  1410  =  1     0    1    0    0    0    0    0    0
    Bin  2004  =  1     0    0    0    0    0    0    1    0
    Bin  2240  =  1     0    0    0    0    1    0    0    0
    Bin  2247  =  1     0    0    1    0    0    0    0    0
    Bin  2300  =  1     0    0    0    0    1    0    0    0
    Bin  2309  =  1     0    0    0    1    0    0    0    0
    Bin  2310  =  3     1    1    0    0    0    0    0    1
    Bin  2602  =  1     0    0    0    1    0    0    0    0