I believe this does what you want.
awk 'alen==length($1) {for (i=a;i<=$1;i++) print i}; {a=$1; alen=length(a); if (a==(i-1)) {a++}}'
When alen
(the length of a) is the same as the length of the current line loop between a
and $1
printing out all missing values.
Then set a
to the new $1
, alen
to the length of a
, and when we dealt with a missing range (when a
is the same as i - 1
) increment a so we don't duplicate that number (this handles cases of sequential lines like 335
, 339
, 350
without duplicating 339
).
With credit to @fedorqui for the basic idea.
Edit: I believe this fixes the problem I noted in the comments (which I think is what @JohnB was indicating as well):
awk '{f=0; if (alen==length($1)) {for (i=a;i<=$1;i++) print i} else {f=1}} {a=$1; alen=length(a)} a==(i-1){a++} f{print; a++}'
I feel like there should be a simpler way to do that but I don't see it at the moment.
Edit again: The input file I ended up testing with:
335
339
340
345
3412
34125
666665
666668
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…