Remi.b
Remi.b

Reputation: 18229

awk: Search missing value in file

awk newbie here! I am asking for help to solve a simple specific task.

Here is file.txt

1
2
3
5
6
7
8
9

As you can see a single number (the number 4) is missing. I would like to print on the console the number 4 that is missing. My idea was to compare the current line number with the entry and whenever they don't match I would print the line number and exit. I tried

cat file.txt | awk '{ if ($NR != $1) {print $NR; exit 1} }'

But it prints only a newline.

I am trying to learn awk via this small exercice. I am therefore mainly interested in solutions using awk. I also welcome an explanation for why my code does not do what I would expect.

Upvotes: 0

Views: 229

Answers (3)

justaguy
justaguy

Reputation: 3022

Maybe this will help:

seq $(tail -1 file)|diff - file|grep -Po '.*(?=d)'
4

Since I am learning awk as well

awk 'BEGIN{i=0}{i++;if(i!=$1){print i;i=$1}}' file
4

`awk` explanation read each number from `$1` into array `i` and increment that number list line by line with `i++`, if the number is not sequential, then print it.

cat file
1
2
3
5
6
7
8
9
11
12
13
15

 awk 'BEGIN{i=0}{i++;if(i!=$1){print i;i=$1}}' file
 4
 10
 14

Upvotes: 0

karakfa
karakfa

Reputation: 67507

since you have a solution already, here is another approach, comparing with previous values.

awk '$1!=p+1{print p+1} {p=$1}' file

you positional comparison won't work if you have more than one missing value.

Upvotes: 2

VIPIN KUMAR
VIPIN KUMAR

Reputation: 3147

Try this -

awk '{ if (NR != $1) {print NR; exit 1} }' file.txt
4

Upvotes: 2

Related Questions