awk command for complex search and print


Input:


9999~cbc~100~209~ozzxczcz~10001001001~100~abc10
123~a~sdklfjl~sldoi~~~ksjdfnkjsdf~123456
125~g~sdklfjl~slsdfsdfsdfsdfdoi~~~~~~~~ksjdfnkjsdf~345
127~wera~sdklfjl~sldoi~~~ksjdfnkjsdf~123
128~awer~swerwerdklfjl~sldoi~~~ksjdfnkjsf~1da2345
9999~cbuc~101~109~oiuxczcz~1000198230001~1609~dbc10
123~a~sdklfjl~sldoi~~~ksjdfnkjsdf~123456
124~g~sdklfjl~slsdfsdfsdfsdfdoi~~~~~~~~ksjdfnkjsdf~345
126~wera~sdklfjl~sldoi~~~ksjdfnkjsdf~9999
1223~awer~swerwerdklfjl~sldoi~~~ksjdfnkjsf~1da2345
9999~cbuc~9101~jdh2~bh89xczcz~100120001~309~kbc10
123~a~sdklfjl~sldoi~~~ksjdfnkjsdf~123456
125~g~sdklfjl~slsdfsdfsdfsdfdoi~~~~~~~~ksjdfnkjsdf~345
127~wera~sdklfjl~sldoi~~~ksjdfnkjsdf~123
128~awer~swerwerdklfjl~sldoi~~~ksjdfnkjsf~1da2345
output:
 if i search for starting with 9999  and dbc10 then it should print from starting 9999 until next occurance of 9999. 

9999~cbuc~101~109~oiuxczcz~1000198230001~1609~dbc10
123~a~sdklfjl~sldoi~dbc10~~ksjdfnkjsdf~123456
124~g~sdklfjl~slsdfsdfsdfsdfdoi~~~~~~~~ksjdfnkjsdf~345
126~wera~sdklfjl~sldoi~~~ksjdfnkjsdf~9999
1223~awer~swerwerdklfjl~sldoi~~~ksjdfnkjsf~1da2345

Thanks .
[/quote]

How about:

awk '/^9999~/{p=0} /dbc10/{p=1}p' file

I cannot reproduce this with your input file.

$ awk '/^9999~/{p=0} /dbc10/{p=1}p' file
9999~cbuc~101~109~oiuxczcz~1000198230001~1609~dbc10
123~a~sdklfjl~sldoi~~~ksjdfnkjsdf~123456
124~g~sdklfjl~slsdfsdfsdfsdfdoi~~~~~~~~ksjdfnkjsdf~345
126~wera~sdklfjl~sldoi~~~ksjdfnkjsdf~9999
1223~awer~swerwerdklfjl~sldoi~~~ksjdfnkjsf~1da2345

What is your OS and version?

--
Alternatively you could try:

awk '/^9999~/&&p{exit} /dbc10/{p=1}p' file
AIX OPERATING SYSTEM

Also on AIX I cannot reproduce your outcome, with the sample you provided:

(AIX)$ awk '/^9999~/{p=0} /dbc10/{p=1}p' file
9999~cbuc~101~109~oiuxczcz~1000198230001~1609~dbc10
123~a~sdklfjl~sldoi~~~ksjdfnkjsdf~123456
124~g~sdklfjl~slsdfsdfsdfsdfdoi~~~~~~~~ksjdfnkjsdf~345
126~wera~sdklfjl~sldoi~~~ksjdfnkjsdf~9999
1223~awer~swerwerdklfjl~sldoi~~~ksjdfnkjsf~1da2345

After few modifications i am getting the proper output. thanks

awk '/^9999|~/{p=0} /dbc10/{p=1}p' file

but it is not returning any thing when i try to use as a parameter

input.txt

abc10
nnn12
llll12
34332
12o12po
for samp in `cat input.txt`
do
temp=`echo "T1"$samp`
awk '/^9999|~/{p=0} /$temp/{p=1}p' file
done 

.

Because the awk script is in single quotes in your code, the $temp variable does not get expanded. You would need to use double quotes, but that poses other kinds of issues. A good way is to use the -v variable= method:

Try:

while read samp
do
  awk -v temp="T1$samp" '/^9999|~/{p=0} $0~temp{p=1}p' file
done < input.txt

Also note the the / .. / is a constant match in which you cannot use variables. Therefore you need to use $0~var instead.