Add comment on last line if found match


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Add comment on last line if found match
# 8  
Old 12-13-2017
Quote:
Originally Posted by Don Cragun
You can find lots of examples in the UNIX & Linux Forums of awk scripts that work on two or more input files and that produce two or more output files (although we don't need to do the latter in this case).

In an awk program, each group of statements is of the general form:
Code:
condition { action }

Before any lines are read from any of the input files named as operands, the commands specified in the actions of all groups with the condition BEGIN (if there are any) are executed in the order in which they appear in the awk program. There aren't any BEGIN sections in my code for this thread.

After all files of the input files named as operands have been processed, all commands specified in the actions of all groups with the condition END (if there are any) are executed in the order in which they appear in the awk program.

All other groups are processed in the order in which they appear in the awk program for every record (with default options, each input line in each file is a record) is processed. If the condition for a group evaluates to a non-zero numeric value or to a non-empty string string value (i.e., evaluates to TRUE), the statements in the action for that group are executed in order; otherwise the statements in that group are skipped for that input record. If there is no condition at the start of a group, the commands in the action in that group are always executed. If the condition evaluates to TRUE and the action and braces ({ and }) are omitted, a default action of print (which prints the current state of the current input record) is performed.

I will assume that you can read the manual page on for awk (by giving the command man awk at a ksh primary prompt in your shell window) to see what the standard awk variables, functions, and statements do. I would hope that the comments I supplied in each group explain what that group is trying to do.

The first group:
Code:
{	# Get rid of <carriage-return> at end of line if there
	# is one.  Set cr to <carriage-return> if there was one; otherwise
	# set it to an empty string.
	cr = sub(/\r$/, "") ? "\r" : ""
}

(with no condition is executed for every record read from both input files and does exactly what the comments say it does.

The second group:
Code:
FNR == NR {
	# For all lines in the first input file...
	# Set a search string as an index in the add_com[] array corresponding
	# to this input line.
	add_com["test \"analog/" $0 "\""]
	next
}

is executed when the condition FNR == NR evaluates to TRUE. It evaluates to TRUE when the Number of Records read from the current File (FNR) is equal to the Number of Records read from all files (NR) which happens when any line from the 1st input file is being processed. The next statement in this action causes all remaining statements in the current action (if there are any) and in any following groups to be skipped for this input record, causes the next available input record to be read, and starts processing groups in order for that new input record. The combination of the action and the next statement guarantee that the following group will not be performed for records read from the 1st input file.

The third group:
Code:
{	# For all lines in the second input file, look for a match in add_com[].
	for(i in add_com)
		if(index($0, i)) {
			# Match found.
			# Set this line in the output buffer to include a
			# comment and put back the <carriage-return> if there
			# was one.
			o[FNR] = $0 "  ! comment" cr
			# Note that a modification was made.
			mod = 1
			next
		}
	# No match found.
	# Copy this line to output buffer unchanged (restoring the
	# <carriage-return> if there was one).
	o[FNR] = $0 cr
}

even though there is no condition is only executed for input files after the 1st input file (and in this code there are only two input files). This group copies the input records as they are read into an output buffer array (o[]) with the index in the array being the current input file record number after searching for and updating any lines that contain the key strings created from lines found in the 1st input file.

The fourth group:
Code:
END {	# If any changes were made, copy the new contents of the second file
	# back into that file.
	if(mod)
		for(i = 1; i <= FNR; i++)
			print o[i] > FILENAME
}

with the action END (as described before) evaluates to FALSE for every line read from the two input files and is only processed after end-of-file is reached on both input files. As noted in the comments, this group copies the accumulated output buffer back into the last input file. The number of lines found in the last input file (FNR) and the pathname of the last input file (FILENAME) remain valid during any END actions.

thank you for very details explanation.

sorry i'm still have 1 newb question.

is that able to skip awk and move to other awk if meet condition ?
because im still new and very confuse on those syntax, now i'm doing multiple awk to let it work.

i want something like

Code:
  if(A == 1) then 
     awk '{content}' 
  else 
     awk '{content}'
  end if

currently i'm use the method is write a file with some information and let next awk code use as variable, and then only remove the file.
Moderator's Comments:
Mod Comment Please use CODE tags when displaying sample input, output, and code segments as required by forum rules.

Last edited by Don Cragun; 12-13-2017 at 03:41 AM.. Reason: Add CODE tags.
# 9  
Old 12-13-2017
Quote:
Originally Posted by kttan
thank you for very details explanation.

sorry i'm still have 1 newb question.

is that able to skip awk and move to other awk if meet condition ?
because im still new and very confuse on those syntax, now i'm doing multiple awk to let it work.

i want something like

Code:
  if(A == 1) then 
     awk '{content}' 
  else 
     awk '{content}'
  end if

currently i'm use the method is write a file with some information and let next awk code use as variable, and then only remove the file.
Moderator's Comments:
Mod Comment Please use CODE tags when displaying sample input, output, and code segments as required by forum rules.
I don't know what:
Quote:
is that able to skip awk and move to other awk if meet condition ?
means. I have no idea why you would want to run two seemingly identical awk programs instead of using A == 1 as a condition for the single action (named content in your pseudo-code) in both of your awk scripts.

You said that you're writing a file and let the next awk use something unspecified as a variable, but your code doesn't show that any variables or files are being passed to either of the awk scripts in your pseudo-code.

If there is something in the code I suggested that you don't understand, I'll be happy to try to answer specific questions. If you're just saying that my code is too complex and you don't want to try to understand what it is doing, I'm sorry that I have wasted your time and mine trying to help you.
This User Gave Thanks to Don Cragun For This Post:
# 10  
Old 12-14-2017
Quote:
Originally Posted by Don Cragun
I don't know what:

means. I have no idea why you would want to run two seemingly identical awk programs instead of using A == 1 as a condition for the single action (named content in your pseudo-code) in both of your awk scripts.

You said that you're writing a file and let the next awk use something unspecified as a variable, but your code doesn't show that any variables or files are being passed to either of the awk scripts in your pseudo-code.

If there is something in the code I suggested that you don't understand, I'll be happy to try to answer specific questions. If you're just saying that my code is too complex and you don't want to try to understand what it is doing, I'm sorry that I have wasted your time and mine trying to help you.

sorry for poor english , i'm din't mean that your code is complex and i'm dont want to understand, it very great explanation for your code.

the question i'm asking is difference question regrading the question i'm asking previously, but i'm don't want open another topic , scare it become spam topic.

The question is i'm try pass any information to another awk code, since too much condition, im still on learning status , i'm not well to handle with it , so currently i'm doing is split it to multiple awk , and create file and read the file content as variable.

so i'm asking is that any method for 2 awk share same variable, instate of create new file as a variable.

below is a part from my script.
i have 2 type of condition.
1. if temp.rpt is empty then it will empty the content for board_temp (by using print "" >board_temp, so with this step will making the next awk "look like skip" , and go to 3rd awk.
2. if temp.rpt have content then proceed with next awk.


Code:
#
awk 'END {

if (NR < 2) {
print "" > "board_temp"
}
}' temp.rpt

awk '
{
    x = 0
    Flag = 0
   
    while( getline < "temp.rpt" > 0){
              
        x++ 
        model[x] = $2
        board_number[x] = $1
          
      #  print model[x]
        while( getline < "board_temp" > 0){   
               if($0 == "BOARD " model[x]){
               #       print model[x]
                  FlagFound = 1
               }
              if($0 == "END BOARD"){
                FlagFound = 0
            }
              if(FlagFound == 1){
                  print $0 >> "temp"x
                  if($2 == "1p" && $3 == "100")
                  {
                      print board_number[x]"%" tolower($1) >> "cap_noload.log"
                  }
              }
              
           }     
           close("board_temp")
    }      
        
}' board_temp  


awk 'END {

if (NR < 2) {
   system("cp board board_temp")
   print "" > "cap_noload.log"
}
}' temp.rpt

awk '
{

# find BOARDS at board file and give a flag    
   if($1 == "BOARDS"){
     flag = 1
   }

  if($2 == "1p" && $3 == "100" && flag != 1){
    print tolower($1) >> "cap_noload.log"  
  }
}' board_temp   

#


Moderator's Comments:
Mod Comment Seriously: Please use CODE tags as required by forum rules!

Last edited by RudiC; 12-14-2017 at 05:10 AM.. Reason: Added CODE tags.
# 11  
Old 12-14-2017
Now this is extremely tricky to answer as it has many aspects to cover.

Quote:
Originally Posted by kttan
sorry for poor english , i'm din't mean that your code is complex and i'm dont want to understand, it very great explanation for your code.
You definitely don't need to be perfect nor fluent in English as this is an international site and erveryone in here is aware of possible language barriers and thus deploys maximum tolerance. Still you should target for best depiction of your problem in terms of precision and details.

Quote:
the question i'm asking is difference question regrading the question i'm asking previously, but i'm don't want open another topic , scare it become spam topic.
Don't be afraid. Moderators in here do their best to tell SPAM from meaningful contributions. You also can contact moderators in a dedicated forum if you feel there could be a misjudgement.

Quote:
.
.
.
so i'm asking is that any method for 2 awk share same variable, instate of create new file as a variable.
You can't share across awk invocations. You'll have to take the detour via files (or named pipes) or shell variables.
Quote:
below is a part from my script.
i have 2 type of condition.
1. if temp.rpt is empty then it will empty the content for board_temp (by using print "" >board_temp, so with this step will making the next awk "look like skip" , and go to 3rd awk.
2. if temp.rpt have content then proceed with next awk.
.
.
.
Methinks you're missing the initial part - where temp.rptis being written - or not. Without digging deeper into your code, why not use one single awk script, mayhap supplying e.g. shell variable having a boolean value indicating that file being empty or not, like e.g.
Code:
[ -s temp.rpt ] && FS=1 || FS=0
awk -vSIZE=$FS ' . . . '

or, check within awk with a system function call...
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Modify text file if found multiple pattern match for every line.

Looking for help, i have input file like below and want to modify to expected output, if can without create additional file, hope can direct modify it. have 2 thing need do. 1st is adding a word (testplan generation off) after ! ! IPG: Tue Aug 07 14:31:17 2018 2nd is adding... (16 Replies)
Discussion started by: kttan
16 Replies

2. Shell Programming and Scripting

How to print the entire line if the mentioned match is found?

Hello Everyone, I have a file with 5 fields in each line just like mentioned below. Also the 4th field is time elapsed(hh:mm:ss) since the process is running xyz abc status 23:00:00 idle abc def status 24:00:00 idle def gji status 27:00:02 idle fgh gty status 00:00:00 idle Here I... (8 Replies)
Discussion started by: rahul2662
8 Replies

3. Shell Programming and Scripting

Displaying text till pattern match found in a line

Hi All, From the below line if we want to display all the text till found pattern dot/. I was trying with the below code but couldn't able to print text before the pattern. it display texts which is found after pattern. awk '/assed/{print;getline;print}' file_name | sed 's/^*. *//' input... (4 Replies)
Discussion started by: Optimus81
4 Replies

4. UNIX for Dummies Questions & Answers

Display n lines after match found and other line

I have a file like this DoctorName Address1 Address2 DOB InsuredName Address1 Address2 DOB PatientName Address1 Address2 DOB ClaimNo1 DoctorName Address1 Address2 DOB InsuredName (2 Replies)
Discussion started by: nsuresh316
2 Replies

5. UNIX for Dummies Questions & Answers

awk display the match and 2 lines after the match is found.

Hello, can someone help me how to find a word and 2 lines after it and then send the output to another file. For example, here is myfile1.txt. I want to search for "Error" and 2 lines below it and send it to myfile2.txt I tried with grep -A but it's not supported on my system. I tried with awk,... (4 Replies)
Discussion started by: eurouno
4 Replies

6. Shell Programming and Scripting

add line and remove comment in some script

Hi, i need some help. i am not sure about my idea. I have a script directory under my home directory,which has a lot of scripts in it. These are some names of the scripts in /axxhome/prdv/script aly300.sh axt300.sh arv300.sh clp300.sh ctth300.sh aly400.sh axt400.sh arv400.sh... (6 Replies)
Discussion started by: debu000
6 Replies

7. Shell Programming and Scripting

help with script to send email and if subject line match is found

Help with script that will check log, then find a match is found, add that as the subject line. 1. The script will always run as a deamon.. and scan the event.log file 2. when a new 101 line is added to the event.log file, have the script check position 5,6 and 7 which is the job name, which... (2 Replies)
Discussion started by: axdelg
2 Replies

8. Shell Programming and Scripting

Need one-liner to look for a line and add it if not found

I need a good one-liner to look in a specific text file for a line of text and if it's not found, add it at the bottom of the file. Perl, sed, not particular, whatever works. To make matters worse, the line of text is in a config script with lots of special characters and needs lots of... (3 Replies)
Discussion started by: brendaT
3 Replies

9. Shell Programming and Scripting

if match found go to a particular line in perl

Hello Experts, I am newbie to perl, just curious to know how to do the following in perl. suppose I ve a txt file like below. when it founds "*Main Start" Then go to "*Main End,,,,,,,," patteren and just collect the number from the previous line of "*Main End,,,,,,," pattern . In my... (17 Replies)
Discussion started by: user_prady
17 Replies

10. Shell Programming and Scripting

Need to add a comment line in a text file

Hi I need to add a comment line at the begining of a text file. The scenario is given below. 1. The number of servers that needs to be updated is around 80 2. The location of the text file in all the servers are the same including the file name. 3. The comment has to be added at the very... (2 Replies)
Discussion started by: orakhan
2 Replies
Login or Register to Ask a Question