Make awk gsub take value of for loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Make awk gsub take value of for loop
# 1  
Old 02-25-2018
Make awk gsub take value of for loop

I am running Debian, mksh shell and #!/bin/mksh script.

Here is one instance I am trying to match. There are other level and n values, but they must be gathered in numerical order or the program will not work properly:
Code:
level="0" n="0"

Here is my code which does not work:
Code:
{ for (a = 0; a <= 10; ++a)
     { gsub(/level="[a]" n="[0-9]"/, "") }
}

The above code does not match and execute it, but the below code does. This is only proof of concept that it can be matched:
Code:
{ for (a = 0; a <= 10; ++a)
     { gsub(/level="0" n="[0-9]"/, "") }
}

So it seems that gsub is not taking the a parameter. How can I make gsub take the value of the for loop?

Thank you.

Btw, I have tried:
Code:
{ gsub(/level="[0-9]" n="[0-9]"/, "") }

This catches other instances before level="0" n="0".
# 2  
Old 02-25-2018
Regexes enclosed in slashes /.../ are regex constants, i.e. taken verbatim / literally. So a won't be replaced by its contents but matches "a".
Try to build the regex from partial string constants and variable contents, like e.g.
Code:
gsub("level=\"" a "\" n=\"[0-9]\"", "")

Not sure, though, what your intentions are with the square brackets around the a variable. And, why not a taylored regex (with "alternation") in lieu of the loop across a .
Some decent input (good and bad, i.e. to be matched or not) samples would help to understand what you're after.

Last edited by RudiC; 02-25-2018 at 09:47 AM..
This User Gave Thanks to RudiC For This Post:
# 3  
Old 02-25-2018
Moderator's Comments:
Mod Comment Removed duplicate / edited paragraphs


Quote:
Originally Posted by RudiC
Regexes enclosed in slashes /.../ are regex constants, i.e. taken verbatim / literally. So a won't be replaced by its contents but matches "a".
Try to build the regex from partial string constants and variable contents, like e.g.
Code:
gsub("level=\"" a "\" n=\"[0-9]\"", "")

Not sure, though, what your intentions are with the square brackets around the a variable. And, why not a taylored regex (with "alternation") in lieu of the loop across a .
Some decent input (good and bad, i.e. to be matched or not) samples would help to understand what you're after.
This was the code needed to make it work! Thank you!

The big issue was that it must match perfectly or it would mess up the printout by going past its point and overwriting other data. With the forums help Smilie, I got that fixed (after 6hrs of droning at the comp). Maybe there is a very simple way, but none of the other offered solutions have worked so far, though I did learn new things from them. Smilie

The square brackets were just a beginners mistake; I was trying to use them as some sort way of inputting a substitution. Smilie


If anyone is interested, a working solution is here. It's not the most efficient, but it works perfectly. If anyone wants all the code, just ask:
Code:
# Find 'sense id' number and store in a variable
{ /<sense id=\"n.*" level/; {vID = substr($2, 1, length($2)-1)}}

# Used for testing to see value:
# {print "vID: " vID}

# If matched then print section divider
{ for (vid = 0; vid <= 19; vid++){
    { for (vl = 0; vl <= 3; vl++){
        { for (vn = 0; vn <=25; vn++){

            {if (vn<=10) {vnx=vn    } }
            {if (vn==11) {vnx="I"    } }
            {if (vn==12) {vnx="II"    } }
            {if (vn==13) {vnx="III"    } }
            {if (vn==14) {vnx="IV"    } }
            {if (vn==15) {vnx="IV."    } }
            {if (vn==16) {vnx="V"    } }
            {if (vn==17) {vnx="V."  } }
            {if (vn==18) {vnx="A"  } }
            {if (vn==19) {vnx="B"  } }
            {if (vn==20) {vnx="C"  } }
            {if (vn==21) {vnx="D"  } }
            {if (vn==22) {vnx="E"  } }
            {if (vn==23) {vnx="F"  } }
            {if (vn==24) {vnx="G"  } }
            {if (vn==25) {vnx="H"  } }

                        # Used for testing to see values:
            # valuev="<sense " vID "." vid "\" level=\"" vl "\" n=\"" vnx "\" opt=\"n\">"; print valuev "\n"
            # {gsub("<sense " vID "." vid "\" level=\"" vl "\" n=\"" vnx "\" opt=\"n\">", vdefSep)}

                        # Everything is ready, so try to make a match!
            {gsub("<sense " vID "." vid "\" level=\"" vl "\" n=\"" vnx "\" opt=\"n\">", vdefSep)}

        }}
    }}
}}

# A sampe of what I'm trying to match:
#
# <sense id="n1.0" level="0" n="0" opt="n">
# <sense id="n1.1" level="1" n="I" opt="n">
# <sense id="n1.2" level="2" n="A" opt="n">
# <sense id="n1.3" level="2" n="B" opt="n">
# <sense id="n1.4" level="3" n="1" opt="n">
# <sense id="n1.5" level="3" n="2" opt="n">
# <sense id="n1.6" level="1" n="II" opt="n">
# <sense id="n1.7" level="2" n="A" opt="n">
# <sense id="n1.8" level="3" n="1" opt="n">
# <sense id="n1.9" level="3" n="2" opt="n">
# <sense id="n1.10" level="2" n="B" opt="n">
# <sense id="n1.11" level="3" n="1" opt="n">
# <sense id="n1.12" level="3" n="2" opt="n">
# <sense id="n1.12" level="3" n="2" opt="n">
# <sense id="n1.13" level="3" n="3" opt="n">

Basically, it goes through every single possibility that exists. There must be a better way. Smilie

Last edited by RudiC; 02-25-2018 at 03:37 PM.. Reason: Removed duplicated / edited paragraphs[
# 4  
Old 02-25-2018
A few comments, although I'm afraid I didn't understand all the details of your code snippet nor interpret any of those correctly. Partly due to the unusual indenting that doesn't lend itself immediately:
- Although braces don't hurt and the parser will understand / eliminate them, too many of them makes the code difficult to read. {if (vn<=10) {vnx=vn } } can be written as if (vn<=10) vnx=vn without sacrifying logics but improving readability.
- for every single input line, you execute those nested loops 20 x 4 x 26, i.e. 2080 times - quite lengthy for more than a few input lines.
- instead of the 16 ifs for the vnx constants assignment, you could use an array.
- you seem to execute 2080 gsubs on $0 with different patterns, each and every one overwriting the former ones - not sure if each of those really makes sense and is necessary.

I could imagine that if you explain your problem verbosely in plain English supporting this with a few meaningful examples, people in here could come up with a taylored, crisp proposal on how to improve and accelerate the solution.

EDIT:
This
Code:
{ /<sense id=\"n.*" level/; {vID = substr($2, 1, length($2)-1)}}

is NOT a pattern {action} pair and will change vID with every new input line. Is that intended? Why then the /<sense id=\"n.*" level/?


EDIT 2: After replacing the gsub with a print - just as a proof of concept - , this yields the identical output as your code above:
Code:
awk '
BEGIN   {split ("1 2 3 4 5 6 7 8 9 10 I II III IV IV. V V. A B C D E F G H", VNARR)
         VNARR[0] = 0
        }

        {vID = substr($2, 1, length($2)-1)

#               Used for testing to see value:
#               {print "vID: " vID}

#               If matched then print section divider
         for (vid = 0; vid <= 19; vid++)
           for (vl = 0; vl <= 3; vl++)
             for (vn = 0; vn <=25; vn++)        print "<sense " vID "." vid "\" level=\"" vl "\" n=\"" VNARR[vn] "\" opt=\"n\">", vdefSep
        }

' file


Last edited by RudiC; 02-25-2018 at 07:19 PM..
This User Gave Thanks to RudiC For This Post:
# 5  
Old 02-25-2018
Quote:
Originally Posted by RudiC
- Although braces don't hurt and the parser will understand / eliminate them, too many of them makes the code difficult to read. {if (vn<=10) {vnx=vn } } can be written as if (vn<=10) vnx=vn without sacrifying logics but improving readability.
Yes, I will try to ensure all new code is trimmed down. For now, I don't want to mess with the other braces.

Quote:
- for every single input line, you execute those nested loops 20 x 4 x 26, i.e. 2080 times - quite lengthy for more than a few input lines.
Yes, I know no other working alternative. Smilie

Quote:
- instead of the 16 ifs for the vnx constants assignment, you could use an array.
How eloquent that is! This is the type of thing I was looking for—so many lines saved! Smilie

Quote:
- you seem to execute 2080 gsubs on $0 with different patterns, each and every one overwriting the former ones - not sure if each of those really makes sense and is necessary.
I hadn't known that; my thought was that gsub only executed on a match? Maybe something like (and I've tried to make this work for a while):
Code:
# Make a variable for easy access:
IDvar="<sense " vID "." vid "\" level=\"" vl "\" n=\"" VNARR[vn] "\" opt=\"n\">"

# If that variable exists, then run gsub.
if (/IDvar/) gsub(IDvar, vdefSep)

Quote:
I could imagine that if you explain your problem verbosely in plain English supporting this with a few meaningful examples, people in here could come up with a taylored, crisp proposal on how to improve and accelerate the solution.
Thank you. I try to keep speech to a min, so people aren't overwhelmed...

Quote:
EDIT:
This
Code:
{ /<sense id=\"n.*" level/; {vID = substr($2, 1, length($2)-1)}}

is NOT a pattern {action} pair and will change vID with every new input line. Is that intended? Why then the /<sense id=\"n.*" level/?
It would actually be the same due to how the xml file stores things, but, that said, you are right; it is not necessary to run and rerun that variable, even if the info is constant. I've taken it out of the for loop and put it just before. Smilie


Here is the updated version:
Code:
#!/bin/mksh

# This program requires an xml dictionary file to run. If it is not on your machine,
# this program will automatically download it and store in ~/.config/latin/.

# Name this file as 'latin' and run:
#
# $ chmod +x latin
#
# To run:
# $ ./latin amo
#
# To enable internet auto-decline:
# $ ./latin -d amo
#
# To run with only auto-decline:
# $ ./latin -c amo
#
# Where 'amo' is the term searched.

searchTerm=$2

URL="http://www.perseus.tufts.edu/hopper/morph?l=$searchTerm&la=la"

wFIN='<h4 class="la">'
wFOUT='</h4>'
wDefIn='<span class="lemma_definition">'
wDefOut='</span>'
wFormIn='<td class="la">'$searchTerm'</td>'
wFormOut='<td style="font-size: x-small">'

## Code which connects to perseus to attain 1st per. sg. (needed as key for xml file)
if [[ ("$1" == "-d") ]]; then

	searchTerms=$(wget -q -O- "$URL" | mawk -v vWFIN="$wFIN" -v vWFOUT="$wFOUT" \
	' $0 ~ vWFIN,$0 ~ vWFOUT {printf substr($0,18, length($0)-22)"\n"; next;}')

elif [[ ("$1" == "-c") ]]; then

	wget -q -O- "$URL" | mawk -v vDefIn="$wDefIn" -v vDefOut="$wDefOut" -v vFormIn="$wFormIn" -v vFormOut="$wFormOut" -v vWFIN="$wFIN" -v vWFOUT="$wFOUT" \
	' $0 ~ vWFIN,$0 ~ vWFOUT {printf "\n[ " substr($0,18, length($0)-22)" ]"; next;}   $0 ~ vDefIn,$0 ~ vDefOut {{ if (!/>/) {{$1=$1}1; x+=1; print " "$0"";} }}   $0 ~ vFormIn,$0 ~ vFormOut {{ if (!/td /) {{$1=$1}1;   $0=substr($0,5, length($0)-9); print "-"$0; next;} } }'

else
	searchTerms=$1
fi

if [ "$1" == "-c" ]; then
	exit
fi

XMLfile=Perseus_text_1999.04.0060.xml
XMLdir=~/.config/latin/
XMLlink="http://www.perseus.tufts.edu/hopper/dltext?doc=Perseus:text:1999.04.0060"

if [ ! -e $XMLdir$XMLfile ]; then
        echo "\nFile:" $XMLdir$XMLfile "not found.\n\nDownloading from" $XMLlink "...\n"
	mkdir -p ~/.config/latin
	wget -qO- $XMLlink | tr -d '\r' > $XMLdir$XMLfile
fi

for searchTerm in $searchTerms
do

#echo "Searching for:"$searchTerms

keyIn='key="'$searchTerm'"'	# Which tag shall be searched?
keyOut='</entry>'	#
tagIn='<'		# How are tags to be distinguished?
tagOut='>'		#
keySepA=''		# Separates the main word from its roots
keySepB=','		#
etySepA='['		# Etymology left
etySepB=']\n\n • '	# Etymology right
defSep='\n\n '          # Separates individual definitions
emSep='\n\n • '		# Separates em-dashes

#echo $keyIn

# First concatenate the result into a usable string
awk -v vkeyIn="$keyIn" -v vkeyOut="$keyOut" ' $0 ~ vkeyIn, $0 ~ vkeyOut {printf $0; }' $XMLdir$XMLfile |
awk -v tagIn="$tagIn" -v tagOut="$tagOut" -v vkeySepA="$keySepA" -v vkeySepB="$keySepB" -v vdefSep="$defSep" -v vetySepA="$etySepA" -v vetySepB="$etySepB" -v vemSep="$emSep" '

	# Separation after main key word
	{ gsub("<orth>", vkeySepA) }
	{ gsub("</orth>", vkeySepB) }

	# Add separation for several variations of definitions
	#{gsub(/<etym lang="la" opt="n">/, vetySepA)}
	# Testing
	{ gsub(/<sense id.*><etym lang="la" opt="n">/, vetySepA) }
	{ gsub(/<\/etym>\. —<\/sense>/, "]") }
	{ gsub(/<\/etym>\, <trans opt="n">/, vetySepB) }
	{ gsub(/<\/etym>\.—/, vetySepB) }
	{ gsub(/<\/etym>\. /, "]") }

	# Get rid of potential extra definition markers
	{ gsub(/\.—<\/sense>/, ".") }
	{ gsub(/\.— <\/sense>/, ".") }
	{ gsub(/\. — <\/sense>/, ".") }
	{ gsub(/<\/usg>—<\/sense>/, ".") }

	{ vID = substr($2, 1, length($2)-1) }

BEGIN   { split ("1 2 3 4 5 6 7 8 9 10 I II III IV IV. V V. A B C C. D E F G H", VNARR)
         VNARR[0] = 0
        }

        {

	#If matched then print section divider
	for (vid = 0; vid <= 19; vid++)
	  for (vl = 0; vl <= 3; vl++)
	    for (vn = 0; vn <=26; vn++) {

		#IDvar="<sense " vID "." vid "\" level=\"" vl "\" n=\"" VNARR[vn] "\" opt=\"n\">"
		#print IDvar

		gsub("<sense " vID "." vid "\" level=\"" vl "\" n=\"" VNARR[vn] "\" opt=\"n\">", vdefSep )

		}
	}

	# Add missing dot after gender
	{ gsub(/<\/gen>/, ". ") }

	# Collapse all remaining tags
	{ gsub(tagIn "[^" tagOut "]*" tagOut, "") }

	# Separate em-dash text
	{ if ((!/—\\,/) && (!/[a-zA-Z]—/) && (!/ —/)) {gsub (/—/, vemSep) }}
        { if ((!/—\\,/) ) {gsub (/\.—/, "." vemSep)}}
        { gsub (/ — /, vemSep)}
	{ if (!/—\\,/) {gsub (/\.—/, "." vemSep)}}

	# Remove double spaces and spaces between certain characters
	{ gsub(/ +/,  " ") }
	{ gsub(/ ,/,  ",") }
	{ gsub(/\( /, "(") }
	{ gsub(/ \)/, ")") }
	{ gsub(/ \./, ".") }
	{ gsub(/ \:/, ":") }
	{ gsub(/ \?/, "?") }
	{ gsub(/\‘ /, "‘") }
	{ gsub(/ \’/, "’") }
	{ gsub(/^ /,  "" ) }
	{ gsub(/\.\.\. /, "...") }
	{ NF }

{ print "\n" $0 "\n" }'

done

I had made a version with such great notes, but upon finishing it, there was an error which I could fix. Likely I lost a bracket somewhere. Smilie

Once again, thank you all. I am still (always) open to any other suggestions. Smilie


*EDIT*

Updated script: XML dictionary file is now automatically downloaded to ~/.config/latin/ if not present. There is no manual downloading required. Just run the script and all is done automatically. Smilie

Last edited by bedtime; 02-26-2018 at 05:21 AM.. Reason: Updated script
# 6  
Old 02-26-2018
Quote:
Originally Posted by bedtime
. . .

Quote:
- for every single input line, you execute those nested loops 20 x 4 x 26, i.e. 2080 times - quite lengthy for more than a few input lines.
Yes, I know no other working alternative. Smilie
As already proposed, if you describe what is needed someone could come up with some nifty trick e.g. regex. Pls be aware that if the substitution has taken place in the first loop, another 2079 loops will be executed nevertheless.

Quote:
I hadn't known that; my thought was that gsub only executed on a match? Maybe something like (and I've tried to make this work for a while):
Code:
# Make a variable for easy access:
IDvar="<sense " vID "." vid "\" level=\"" vl "\" n=\"" VNARR[vn] "\" opt=\"n\">"

# If that variable exists, then run gsub.
if (/IDvar/) gsub(IDvar, vdefSep)

gsub analyses the input line / variable char by char for a match, as does the matching operators, e.g. /.../ - so it parses the input twice. Unnecessary, and costly, esp. for lengthy lines. If you're sure there is only one single match, use sub to stop after that match. BTW, /IDvar/ looks for exactly that literal string, "IDvar", verbatim.

Quote:
Thank you. I try to keep speech to a min, so people aren't overwhelmed...
. . .
I wasn't asking for a romantic novel, but for a meaningful explanation / formulation of the central problem(s).

Quote:
I had made a version with such great notes, but upon finishing it, there was an error which I could fix. Likely I lost a bracket somewhere. Smilie
There are editors in them 'thar hills that allow for checking for e.g. unpaired brackets, braces, parentheses. Clever indentation also helps.

Last edited by RudiC; 02-26-2018 at 05:24 AM..
This User Gave Thanks to RudiC For This Post:
# 7  
Old 02-26-2018
Quote:
Originally Posted by RudiC
As already proposed, if you describe what is needed someone could come up with some nifty trick e.g. regex. Pls be aware that if the substitution has taken place in the first loop, another 2079 loops will be executed nevertheless.
Issue fixed. With one line of code:

Code:
gsub(vdefTagIn "[^" vdefTagOut "]*" vdefTagOut, vdefSep)

where the tags were defined as '<sense' and '>'. No more need for 2079 loops of madness.


Anyways, nothing was wasted; all the ideas posted will help in future scripting. Smilie

As of now, I will be working on merging some gsub commands with regex tricks.

Oh-and about the braces, when I removed certain ones the program would not operate correctly; it would scatter text and such. I just added a brace between the beginning of the program (after the variables) and before { print $0 }, and I was able to remove all the other braces! Smilie


If anyone is interested:

latin:
Code:
#!/bin/mksh

# This program requires an xml dictionary file to run. If it is not on your machine,
# this program will automatically download it and store in ~/.config/latin/.

# Name this file as 'latin' and run:
#
# $ chmod +x latin
#
# To run:
# $ ./latin amo
#
# To enable internet auto-decline:
# $ ./latin -d amo
#
# To run with only auto-decline:
# $ ./latin -c amo
#
# Where 'amo' is the term searched.

key=$2

URL="http://www.perseus.tufts.edu/hopper/morph?l=$key&la=la"

wFIN='<h4 class="la">'
wFOUT='</h4>'
wDefIn='<span class="lemma_definition">'
wDefOut='</span>'
wFormIn='<td class="la">'$key'</td>'
wFormOut='<td style="font-size: x-small">'

## Code which connects to perseus to attain 1st per. sg. (needed as key for xml file)
if [[ ("$1" == "-d") ]]; then

	searchTerms=$(wget -q -O- "$URL" | mawk -v vWFIN="$wFIN" -v vWFOUT="$wFOUT" \
	' $0 ~ vWFIN,$0 ~ vWFOUT {printf substr($0,18, length($0)-22)"\n"; next;}')

elif [[ ("$1" == "-c") ]]; then

	wget -q -O- "$URL" | mawk -v vDefIn="$wDefIn" -v vDefOut="$wDefOut" -v vFormIn="$wFormIn" -v vFormOut="$wFormOut" -v vWFIN="$wFIN" -v vWFOUT="$wFOUT" \
	' $0 ~ vWFIN,$0 ~ vWFOUT {printf "\n[ " substr($0,18, length($0)-22)" ]"; next;}   $0 ~ vDefIn,$0 ~ vDefOut {{ if (!/>/) {{$1=$1}1; x+=1; print " "$0"";} }}   $0 ~ vFormIn,$0 ~ vFormOut {{ if (!/td /) {{$1=$1}1;   $0=substr($0,5, length($0)-9); print "-"$0; next;} } }'

else
	searchTerms=$1
fi

if [ "$1" == "-c" ]; then
	exit
fi

XMLfile=Perseus_text_1999.04.0060.xml
XMLdir=~/.config/latin/
XMLlink="http://www.perseus.tufts.edu/hopper/dltext?doc=Perseus:text:1999.04.0060"

if [ ! -e $XMLdir$XMLfile ]; then
        echo "\nFile:" $XMLdir$XMLfile "not found.\n\nDownloading from" $XMLlink "...\n"
	mkdir -p ~/.config/latin
	wget -qO- $XMLlink | tr -d '\r' > $XMLdir$XMLfile
fi

for key in $searchTerms; do

keyIn='key="'$key'"'	# Which tag shall be searched?
keyOut='</entry>'	#
tagIn='<'		# How are tags to be distinguished?
tagOut='>'		#
defTagIn='<sense'	# How are definitions defined?
defTagOut='>'
keySepA=''		# Separates the main word from its roots
keySepB=','		#
etySepA='['		# Etymology left
etySepB=']\n\n • '	# Etymology right
defSep='\n\n '          # Separates individual definitions
emSep='\n\n • '		# Separates em-dashes

# First concatenate the result into a usable string
awk -v vkeyIn="$keyIn" -v vkeyOut="$keyOut" ' $0 ~ vkeyIn, $0 ~ vkeyOut {printf $0; }' $XMLdir$XMLfile |
awk -v vdefTagIn="$defTagIn" -v vdefTagOut="$defTagOut" -v tagIn="$tagIn" -v tagOut="$tagOut" -v vkeySepA="$keySepA" -v vkeySepB="$keySepB" -v vdefSep="$defSep" -v vetySepA="$etySepA" -v vetySepB="$etySepB" -v vemSep="$emSep" '
{
	# Separation after main key word
	gsub("<orth>", vkeySepA)
	gsub("</orth>", vkeySepB)

	# Add separation for several variations of definitions
	#gsub(/<etym lang="la" opt="n">/, vetySepA)
	gsub(/<sense id.*><etym lang="la" opt="n">/, vetySepA)
	gsub(/<\/etym>\. -<\/sense>/, "]")
	gsub(/<\/etym>\, <trans opt="n">/, vetySepB)
	gsub(/<\/etym>\.-/, vetySepB)
	gsub(/<\/etym>\. /, "]")

	# Get rid of potential extra definition markers
	gsub(/\.-<\/sense>/, ".")
	gsub(/\.- <\/sense>/, ".")
	gsub(/\. - <\/sense>/, ".")
	gsub(/<\/usg>-<\/sense>/, ".")
	gsub(/<\/usg> -<\/sense>/, ".")

	# Add missing dot after gender
	gsub(/<\/gen>/, ". ")

	# Collapse all definition tags and add formatting in their place
	gsub(vdefTagIn "[^" vdefTagOut "]*" vdefTagOut, vdefSep)

	# Collapse all remaining tags
	gsub(tagIn "[^" tagOut "]*" tagOut, "")

	# Separate em-dash text
	if ((!/-\\,/) && (!/[a-zA-Z]-/) && (!/ -/)) gsub (/-/, vemSep)
        if ((!/-\\,/) ) gsub (/\.-/, "." vemSep)
        gsub (/ - /, vemSep)
	gsub (/ -/, vemSep)
	if (!/-\\,/) gsub (/\.-/, "." vemSep)

	# Remove double spaces and spaces between certain characters
	gsub(/ +/,  " ")
	gsub(/ ,/,  ",")
	gsub(/\( /, "(")
	gsub(/ \)/, ")")
	gsub(/ \./, ".")
	gsub(/ \:/, ":")
	gsub(/ \?/, "?")
	gsub(/\‘ /, "‘")
	gsub(/ \'/, "'")
	gsub(/^ /,  "" )
	gsub(/\.\.\. /, "...")

}

{ print "\n" $0 "\n" } '

done

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Using multiple gsub() function under a loop in awk

Hi ALL, I want to replace string occurrence in my file "Config" using a external file named "Mapping" using awk. $cat Config ! Configuration file for RAVI ! Configuration file for RACHANA ! Configuration file for BALLU $cat Mapping ravi:ram rachana:shyam ballu:hameed The... (5 Replies)
Discussion started by: useless79
5 Replies

2. UNIX for Dummies Questions & Answers

awk gsub with variables

Hello, I'm trying to substitute a string with leading zero for all the records except the trailer record using awk command and with variables. The input file test_med1.txt has data like below 1234ABC...........................9200............LF... (2 Replies)
Discussion started by: somu_june
2 Replies

3. Shell Programming and Scripting

awk gsub

Hi, I want to print the first column with original value and without any double quotes The output should look like <original column>|<column without quotes> $ cat a.txt "20121023","19301229712","100397" "20121023","19361629712","100778" "20121030A","19361630412","100838"... (3 Replies)
Discussion started by: ysrini
3 Replies

4. Shell Programming and Scripting

Awk; gsub in fields 3 and 4

I want to transform a log file into input for a database. Here's the log file: Tue Aug 4 20:17:01 PDT 2009 Wireless users: 339 Daily Average: 48.4285 = Tue Aug 11 20:17:01 PDT 2009 Wireless users: 295 Daily Average: 42.1428 = Tue Aug 18 20:17:01 PDT 2009 Wireless users: 294 Daily... (6 Replies)
Discussion started by: Bubnoff
6 Replies

5. Shell Programming and Scripting

awk gsub with variables?

Hey, I would like to replace a string by a new one. Teh problem is that both strings should be variables to be flexible, because I am having a lot of files (with the same structure, but in different folders) for i in daysim_* do cd $i/5/ folder=`pwd |awk '{print $1}'` awk '{ if... (3 Replies)
Discussion started by: ergy1983
3 Replies

6. Shell Programming and Scripting

Awk gsub error.

I want to replace comma with space and "*646#" with space. I am using the following code: nawk -F"|" '{gsub(","," ",$3); gsub(/\*646\#/"," ",$3);print}' OFS="|" file I am getting following error: Help is appreciated (5 Replies)
Discussion started by: pinnacle
5 Replies

7. Shell Programming and Scripting

Awk Gsub Query

Hi, Can some one please explain the following line please throw some light on the ones marked in red awk '{print $9}' ${FTP_LOG} | awk -v start=${START_DATE} 'BEGIN { FS = "." } { old_line1=$0; gsub(/\-/,""); if ( $3 >= start ) print old_line1 }' | awk -v end=${END_DATE} 'BEGIN { FS="." } {... (3 Replies)
Discussion started by: crosairs
3 Replies

8. Shell Programming and Scripting

awk gsub

Hi all I want to do a simple substitution in awk but I am getting unexpected output. My function accepts a time and then prints out a validation message if the time is valid. However some times may include a : and i want to strip this out if it exists before i get to the validation. I have shown... (4 Replies)
Discussion started by: pxy2d1
4 Replies

9. Shell Programming and Scripting

Help with AWK and gsub

Hello, I have a variable that displays the following results from a JVM.... 1602100K->1578435K I would like to collect the value of 1578435 which is the value after a garbage collection. I've tried the following command but it looks like I can't get the > to work. Any suggestions as... (4 Replies)
Discussion started by: npolite
4 Replies

10. Shell Programming and Scripting

use var in gsub of awk

Hi all, This problem has cost me half a day, and i still do not know how to do. Any help will be appreciated. Thanks advance. I want to use a variable as the first parameters of gsub function of awk. Example: { ... arri]=gsub(i,tolower(i),$1) (which should be ambraced by //) ... } (1 Reply)
Discussion started by: summer_cherry
1 Replies
Login or Register to Ask a Question