I have a file where field 11 contains the following string
FP6000
And i need to increment the final 4 digits 1 each time and overwrite contents of the script with the new number
So increment to FP6001
I've used the following in the past which worked fine but these were all digits no letters
awk '{$11=$11 1}1' $FILE > tmp && mv tmp $FILE
What am i missing here?
CodePudding user response:
Use any version awk
like this:
s='FP6000'
awk '{f=$1; sub(/[0-9] $/, "", f); sub(/^[^0-9]*/, "", $1); print f ($1 1)}' <<< "$s"
FP6001
We store $1
in variable f
then remove all digits in the end. From $1
we strip out all non-digits from start and then append f
and $1 1
together for printing.
CodePudding user response:
If you print just $11 1
you will get 1
as "FP6000" is a string evaluating to 0 when you add 1 to it.
A variation using gnu awk
using a regex with 2 capture groups, setting field 11 to the first group which matches all till before the last digits, followed by an incremented value for group 2
(.*[^0-9])?([0-9] )$
(.*[^0-9])?
Optional capture group 1, matching all until the last occurrence of a non digit([0-9] )
Capture group 2, match 1 or more digits$
End of string
As the first group is optional, it will also work if there are only digits.
awk 'match($11,/(.*[^0-9])?([0-9] )$/,a) {$11=a[1]( a[2])}1' $FILE > tmp && mv tmp $FILE
CodePudding user response:
Given this input file:
$ cat file
1 2 3 4 5 66 7 8 9 10 FP6000 12 13
With GNU awk for the 4th arg to split():
$ awk '{split($11,lets,/[0-9] $/,digs); $11=lets[1] digs[1] 1} 1' file
1 2 3 4 5 66 7 8 9 10 FP6001 12 13
or with any awk:
$ awk 'match($11,/[0-9]/){$11=substr($11,1,RSTART-1) substr($11,RSTART) 1} 1' file
1 2 3 4 5 66 7 8 9 10 FP6001 12 13
CodePudding user response:
Here is a perl to do that:
perl -lnE 'say $1.($2 1) if m/^([^\d] )(\d )/' file
FP6001
CodePudding user response:
Also, another GNU awk
solution:
awk '{l=gensub(/[0-9] $/, "", 1); num=gensub(/^[^0-9] /, "", 1); print l (num 1)}' file
I.e., l
is the word, num
is the number. Once obtained, increment the num
and print them.