pchang
July 13, 2015, 6:32pm
1
Hi Forum.
I have the following script that I would like to use a variable to search using awk but it's not working as expected:
# Define working variables
token_search_string=536088
token_search_length=16
This code example works by hardcoding 536088 in the string search:
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '/536088/ {
match($0, /token_search_string/); print substr($0, RSTART, token_search_length);
}' abc.txt
This code example doesn't work if I reference the token_search_string variable
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '/token_search_string/ {
match($0, /token_search_string/); print substr($0, RSTART, token_search_length);
}' abc.txt
What am I missing here?
Thanks for your help.
Aia
July 13, 2015, 7:17pm
2
pchang:
Hi Forum.
I have the following script that I would like to use a variable to search using awk but it's not working as expected:
# Define working variables
token_search_string=536088
token_search_length=16
This code example works by hardcoding 536088 in the string search:
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '/536088/ {
match($0, /token_search_string/); print substr($0, RSTART, token_search_length);
}' abc.txt
This code example doesn't work if I reference the token_search_string variable
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '/token_search_string/ {
match($0, /token_search_string/); print substr($0, RSTART, token_search_length);
}' abc.txt
What am I missing here?
Thanks for your help.
Awk does not do variable expansion within regex //
It is, literally, looking for the characters: token_search_string
Try
awk -v var=$var '$0 ~ var'
when you need to search in that way.
Try
awk -v token_search_string=$token_search_string -v token_search_length=$token_search_length '{
match($0, token_search_string); if( RSTART>0 ){print substr($0, RSTART, token_search_length)}
}' abc.txt
As match returns zero when no match is found and position when one is, you could do:
awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
match($0, token_search_string) {
print substr($0, RSTART, token_search_length)
}' abc.txt
pchang
July 13, 2015, 10:21pm
4
Thanks Guys for all your suggestions.
pchang
July 17, 2015, 5:44pm
5
chubler_xl:
As match returns zero when no match is found and position when one is, you could do:
awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
match($0, token_search_string) {
print substr($0, RSTART, token_search_length)
}' abc.txt
I have been told that my token_search_string has to be a list of entries.
How can I define the token_search_string containing a list of values such as 536088, 547698 and still have the above awk script work?
Do I need to loop thru the list of values and call the awk script for each value?
Thanks.
Aia
July 17, 2015, 7:41pm
6
In the shell
token_search_string='536088|547698'
2 Likes
pchang
August 5, 2015, 10:27am
7
This is my updated code but having an issue:
token_search_string='536088|536000|536001'
token_search_length=16
awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
match($0, token_search_string) {
print substr($0, RSTART, token_search_length) }'
/data/data2/staging/CREDIT_CARDS/TSYS/V888test.20150101.12010
Input file "V888test.20150101.12010" contains the following record with the search strings italics bolded:
000000000501AT31 0600 0000000 C 2015140 19066035360887343045008 5360887343045008 75360885140140111111121 DBT N BOPURCHASE
CAN0000000000000000 00D N PR 00
00000000000120000000000000000 0000000000 00000 1750010100010001000000006170000000124000112422 N1 0000000 0000000008
2.48 20181350000 2015140 0000000010100 00000000101.00 00000000000.00 20151400000 0000000000000 0368968 2015140 00.000 0.0000 0000000 0000000 N 00
00000.00 0000000 00000000000.00CAN00103 0 0 00000001.000000000 00000000.0000000000 00000000001.01
N 0000
Output is extracting value 5360887343045008 but not 5360885140140111.
How can I update the code so that it will extract multiple search strings within same record?
Please help.
Thanks
not tested....
awk -v token_search_string="$token_search_string" -v token_search_length=$token_search_length '
BEGIN {
split(token_search_string, a, "|")
}
{
for(i=1;i in a; i++)
if (match($0, a))
print substr($0, RSTART, token_search_length)
}' /data/data2/staging/CREDIT_CARDS/TSYS/V888test.20150101.12010
pchang
August 5, 2015, 1:01pm
9
Thanks vgersh99 - I tested your script but only got one output:
5360887343445758
Can you help?
BEGIN {
split(token_search_string, a, "|")
}
{
{
s=t=$0
for(i=1;i in a; i++) {
t=s
while (match(t, a)) {
print substr(t, RSTART, token_search_length)
t=substr(t,RSTART+RLENGTH)
}
}
}
1 Like
pchang
August 5, 2015, 1:34pm
11
Thank you very much for your quick response.
Much appreciated.
The script is working as expected!!!!!