awk finding counting sequence

Can awk count numbers until it reaches the end of the sequence after the slash?

input:

serv1a, 32, 41/47, 53, 89/100, 108/11, 113.
serv1b, 1/2, 114/18, 121/35, 139/40, 143/55, 159/64,
serv2, 255/56, 274/77, 763, 774/75, 777, 1434/35, 1444/50, 1715, 2025/31, 2048.
serv10b, 804, 808, 929/32, 940/42, 977/1020, 1240/41, 1246, 1254/56, 1353, 1377/82.
serv11, 492/538, 674/75, 927/281, 403/06, 1444/50, 1510/19, 1530/37, 1613/18, 1621/23.
serv1a, 255/56, 274/77, 763, 774/75, 777, 1434/35, 1444/50, 1715, 2025/31, 2048.
serv3, 804, 808, 929/32, 940/42, 977/1020, 1240/41, 1246, 1254/56, 1353, 1377/82.
serv4b, 492/538, 674/75, 927/28, 483/87, 492/538, 674/75, 681/85, 689/90, 704/11 762,.
serv5, 1044/47, 483/87, 492/538, 674/75, 681/85, 689/90, 704/11.
serv6, 39/40, 54/55, 80, 82/85, 123/24, 256, 264/70, 275/76, 332/67, 369/80, 401/04. 
serv8, 1044/47, 483/87, 492/538, 674/75, 681/85, 689/90, 704/11 762, 810, 839, 927/28.
serv9a, 255/56, 274/77, 763, 774/75, 777, 1434/35, 1444/50, 1715, 2025/31, 2048.

output

serv1a, 32, 41, 42, 43, 44, 45, 46, 47, 53, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 108, 109, 110, 111, 113.
serv1b, 1, 2, 114, 115, 116, 117, 118, 121, 122, 123, 124, 125, 126, 127.....
serv2, 255, 256, 274, 275, 276, 277, 763, 774, 775, 777, 1434, , 1435, 1444, 1450, 1715, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2048.
...

I've written quick and dirty solution on perl, but got an infinitive loop. What's this:
927/281
???

Sorry a mistake i must have done by hand. It should read 927/28

Try this...

awk -F"," '
{
        printf $1 FS
        for(i=2;i<=NF;i++)
        {
                if(!match($i,"/")){
                        printf $i FS
                        continue
                }
                split($i,arr,"/")
                a=arr[1]; b=arr[2]
                if(arr[1]>arr[2])
                {
                        num=substr(arr[1], 1, length(arr[1])-length(arr[2]))
                        b=num arr[2]

                }
                for(j=a;j<=b+0;j++)
                {
                        printf " "j FS
                }
        }
        printf "\n"
}' input_file

--ahamed

---------- Post updated at 05:50 AM ---------- Previous update was at 05:47 AM ----------

I just saw the post from yazu and was wondering what did my code do with that condition 927/281 and guess what it skipped it... :smiley:

--ahamed

Thanks ahamed, your script does a great job. Though some of the numbers are ommited. Like in the First line the sequence from 108 to 111:

serv1a, 32,  41  42  43  44  45  46  47 53,  89  90  91  92  93  94  95  96  97  98  99  100 113. 
serv1b,  1  2 
serv2, 763, 777, 1715, 2048. 
serv10b, 804, 808,  977  978  979  980  981  982  983  984  985  986  987  988  989  990  991  992  993  994  995  996  997  998  999  1000  1001  1002  1003  1004  1005  1006  1007  1008  1009  1010  1011  1012  1013  1014  1015  1016  1017  1018  1019  1020 1246, 1353, 
serv11,  492  493  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527  528  529  530  531  532  533  534  535  536  537  538 
serv1a, 763, 777, 1715, 2048. 
serv3, 804, 808,  977  978  979  980  981  982  983  984  985  986  987  988  989  990  991  992  993  994  995  996  997  998  999  1000  1001  1002  1003  1004  1005  1006  1007  1008  1009  1010  1011  1012  1013  1014  1015  1016  1017  1018  1019  1020 1246, 1353, 
serv4b,  492  493  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527  528  529  530  531  532  533  534  535  536  537  538  492  493  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527  528  529  530  531  532  533  534  535  536  537  538  704  705  706  707  708  709  710  711 762,. 
serv5,  492  493  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527  528  529  530  531  532  533  534  535  536  537  538 
serv6,  39  40  54  55 80,  82  83  84  85 256, 
serv8,  492  493  494  495  496  497  498  499  500  501  502  503  504  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525  526  527  528  529  530  531  532  533  534  535  536  537  538  704  705  706  707  708  709  710  711 762, 810, 839, 
serv9a, 763, 777, 1715, 2048. 

Can you identify the reason?

Here is my code but it doesn't work. It's because of line ends. Somewhere you have dots, somewhere commas and in one line - 704/11 762,.

perl -F',\s+' -lane '                                                     :( 
BEGIN { $" = ", " }
sub normalize {
  my ($start, $end) = split "/", $_[0];
  if ($start > $end) {
    $end = substr($start, 0, length($start) - length($end)) . $end;
  }
  $_[0] = "$start/$end";
}
sub unwind {
  return if $_[0] !~ m|/|;
  normalize $_[0];
  my ($start, $end) = split "/", $_[0];
  my @v = $start .. $end;
  $_[0] = "@v";
}
$" = ", ";
unwind($_) for @F;
print "@F";
' INPUTFILE
1 Like

It works for me though...

root@bt:/tmp# awk -F"," '
> {
>         printf $1 FS
>         for(i=2;i<=NF;i++)
>         {
>                 if(!match($i,"/")){
>                         printf $i FS
>                         continue
>                 }
>                 split($i,arr,"/")
>                 a=arr[1]; b=arr[2]
>                 if(arr[1]>arr[2])
>                 {
>                         num=substr(arr[1], 1, length(arr[1])-length(arr[2]))
>                         b=num arr[2]
> 
>                 }
>                 for(j=a;j<=b+0;j++)
>                 {
>                         printf " "j FS
>                 }
>         }
>         printf "\n"
> }' input_file

serv1a, 32,  41, 42, 43, 44, 45, 46, 47, 53,  89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,  108, 109, 110, 111, 113.,
serv1b,  1, 2,  114, 115, 116, 117, 118,  121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,  
139, 140,  143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,  159, 160, 161, 162, 163, 164,,
serv2,  255, 256,  274, 275, 276, 277, 763,  774, 775, 777,  1434, 1435,  1444, 1445, 1446, 1447, 1448, 1449, 1450, 
1715,  2025, 2026, 2027, 2028, 2029, 2030, 2031, 2048.,
serv10b, 804, 808,  929, 930, 931, 932,  940, 941, 942,  977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 
989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 
1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,  1240, 1241, 1246,  1254, 1255, 1256, 1353,
serv11,  492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 
514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 
538,  674, 675,  403, 404, 405, 406,  1444, 1445, 1446, 1447, 1448, 1449, 1450,  1510, 1511, 1512, 1513, 1514, 1515, 
1516, 1517, 1518, 1519,  1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537,  1613, 1614, 1615, 1616, 1617, 1618,
serv1a,  255, 256,  274, 275, 276, 277, 763,  774, 775, 777,  1434, 1435,  1444, 1445, 1446, 1447, 1448, 1449, 1450, 
1715,  2025, 2026, 2027, 2028, 2029, 2030, 2031, 2048.,
serv3, 804, 808,  929, 930, 931, 932,  940, 941, 942,  977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 
991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 
1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,  1240, 1241, 1246,  1254, 1255, 1256, 1353,
serv4b,  492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 
515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538,  674, 
675,  927, 928,  483, 484, 485, 486, 487,  492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 
509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 
534, 535, 536, 537, 538,  674, 675,  681, 682, 683, 684, 685,  689, 690,.,
serv5,  1044, 1045, 1046, 1047,  483, 484, 485, 486, 487,  492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 
505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 
530, 531, 532, 533, 534, 535, 536, 537, 538,  674, 675,  681, 682, 683, 684, 685,  689, 690,
serv6,  39, 40,  54, 55, 80,  82, 83, 84, 85,  123, 124, 256,  264, 265, 266, 267, 268, 269, 270,  275, 276,  332, 333, 334, 335, 
336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 
361, 362, 363, 364, 365, 366, 367,  369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380,
serv8,  1044, 1045, 1046, 1047,  483, 484, 485, 486, 487,  492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 
505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 
530, 531, 532, 533, 534, 535, 536, 537, 538,  674, 675,  681, 682, 683, 684, 685,  689, 690, 810, 839,
serv9a,  255, 256,  274, 275, 276, 277, 763,  774, 775, 777,  1434, 1435,  1444, 1445, 1446, 1447, 1448, 1449, 1450, 1715,  
2025, 2026, 2027, 2028, 2029, 2030, 2031, 2048.,

--ahamed

1 Like

It was the field seperator I omitted:D.

Now I encounter another ommitance. When the first field of a line has only one sequence to be calculated then this field will be ommited in the output. Like this.

Input:

serv10b, 804, 808, 929/32, 940/42, 977/1020, 1240/41, 1246, 1254/56, 1353, 1377/82.
serv11, 492/538.

...

output:

serv10b, 804, 808,  929, 930, 931, 932,  940, 941, 942,  977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020,  1240, 1241, 1246,  1254, 1255, 1256, 1353,  1377, 1378, 1379, 1380, 1381, 1382.,
serv11,

It works for me mate!

root@bt:/tmp# cat input_file 
serv10b, 804, 808, 929/32, 940/42, 977/1020, 1240/41, 1246, 1254/56, 1353, 1377/82.
serv11, 492/538.

root@bt:/tmp# awk -F"," '{
        printf $1 FS
        for(i=2;i<=NF;i++)
        {
                if(!match($i,"/")){
                        printf $i FS
                        continue
                }
                split($i,arr,"/")
                a=arr[1]; b=arr[2]
                if(arr[1]>arr[2])
                {
                        num=substr(arr[1], 1, length(arr[1])-length(arr[2]))
                        b=num arr[2]

                }
                for(j=a;j<=b+0;j++)
                {
                        printf " "j FS
                }
        }
        printf "\n"
}
' input_file 
serv10b, 804, 808,  929, 930, 931, 932,  940, 941, 942,  977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 
992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 
1014, 1015, 1016, 1017, 1018, 1019, 1020,  1240, 1241, 1246,  1254, 1255, 1256, 1353,
serv11,  492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 
516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528,529, 530, 531, 532, 533, 534, 535, 536, 537, 538,

--ahamed

Then it must have to do something with gawk on windows:wall:. I need to change the OS. Perhabs it has something to do with the field seperator outside the script. Will check on this.