Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

BASH List Search Awk

Tags:

bash

macos

awk

I'm very new to scripting and trying to work something out in bash. I have a data file filled with information that looks like this:

2   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
4   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1]   1 
8   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
10  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
12  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
14  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
16  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
18  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
20  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
24  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
26  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
28  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
30  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
32  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   

Where the *a's represent various letters and the 1's represent various numbers.

The lists are all supposed to go down vertically from 2 to 32 counting by 2's, however a lot of the lists are missing a couple components, such as the one I posted above which is missing 6 and 22. What I am trying to do is write a script that would go through and check to see if each number is there, and if not, add a line with the number at the front and nothing else trailing, so you'd have:

2   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    
[1] 1   
4   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1]   1 
6

8   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1      
...

From what I have read I believe the AWK function will be the most likely to succeed, however I'm not sure how to make it work. Thanks!

like image 532
user3735358 Avatar asked Jul 05 '26 12:07

user3735358


1 Answers

This awk is based on the output index range of 2-32 (by two) entries:

awk '{a[$1]=$0} END {for(i=2;i<=32;i+=2) print (i in a ? a[i] : i)}' data

The breakdown:

  • Store all the existing lines in an array by their index
  • At the END, walk all known indexes (2-32) and either print the line, or the missing index
like image 61
n0741337 Avatar answered Jul 10 '26 08:07

n0741337



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!