Command to display nth line before the string is matched.


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users Command to display nth line before the string is matched.
# 1  
Old 11-05-2008
CPU & Memory Command to display nth line before the string is matched.

All,

Is there any way out to display the nth line before the string is matched ???
Eg : If i have a file which has the following contents and if i want to get the
3rd line before the string is matched
a
b
c
d
e
f

if i give the input as f and lines before the match as 3 then it should display then it should give c

i.e in this case its the 3rd line before the string is match.


Specifications : There will be 2 inputs
1. String to be matched
2. number


Are there any one line commands to do the same in awk or sed. Need urgent help.
# 2  
Old 11-05-2008
Sounds a little like homework.

If you have gnu (you are on Linux) try grep:
Code:
# two parms: $1 string to find $2 lines above
grep -B $2 "$1"  filename

# 3  
Old 11-05-2008
Jim,

Thanks for a quick reply. I am actually using Solaris and Dont think there is a option -B as in Linux. Let me know if you have anyother thought on this..


Thanks.
# 4  
Old 11-05-2008
Use sed and read in (up to) three lines with the "N" subcommand. Use the "D" and "N" subcommands to set up a loop where the next one line is added to the pattern space and the first line of the pattern space is deleted. Once you have encountered your line the first line in the pattern space is the line you searched for.

(You could also use your pattern space solely for the searching and use the hold space as your buffer. In this case use the respective hold-space-manipulation commands instead of setting up the ring buffer with a D-N-loop.

Similar concepts using a buffer of three lines where one line is added "at the bottom" and the first line deleted surrepetitously can be implemented in awk or even shell too. The following implemetation is probably the slowest and least efficient one but the most readable, so it is showing the mechanism best. Note that the "next element" is - because of the ring structure of the buffer - also the third-to-last one:

Code:
function pNextElement
{
     (( iCnt=(iCnt+1)%3 ))
}

# main()

chLineBuffer[0]=""
chLineBuffer[1]=""
chLineBuffer[2]=""
iCnt=0

cat file | while read chLineBuffer[$iCnt] ; do
     if [ "${chLineBuffer[$iCnt]}" = "string_to_search" ] ; then
          pNextElement
          print - "The result is ${chLineBuffer[$iCnt]}"
     else
          pNextElement
     fi
done

I hope this helps.

bakunin
# 5  
Old 11-05-2008
How about something like this?

Code:
$ cat file.dat
a
b
c
d
e
f

LINE=$(grep -n f file.dat|cut -d: -f1) && LINE=$(($LINE-3)) && head -n $LINE file.dat|tail -1
c

# 6  
Old 11-05-2008
All,

Thanks for the solutions. i was looking at a one line command and the solution given by SFNYC suits.

Bakunin, thanks for the solution as well. I believe the idea of using the sed is good. I shall work on that.. Pour in your thoughts if you find it can be done in much better way.


Thanks to all.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Delete after nth occurence of string in each line

Hello, Environment: I am under Ubuntu 18.04 bionic. I have an sql file consisting of 10K lines. Objective: What I am trying to attain is to remove everything coming after 2nd tab in each line. While searching for the answer, I found two answers and both gave expected result just for the first... (2 Replies)
Discussion started by: baris35
2 Replies

2. Shell Programming and Scripting

Printing string from last field of the nth line of file to start (or end) of each line (awk I think)

My file (the output of an experiment) starts off looking like this, _____________________________________________________________ Subjects incorporated to date: 001 Data file started on machine PKSHS260-05CP ********************************************************************** Subject 1,... (9 Replies)
Discussion started by: samonl
9 Replies

3. Shell Programming and Scripting

Bash Command to Get Nth Line in a String?

hi i need to get the 3rd line in a string. actually, not sure if it's a string, list, array, or something else. I'm using grep to retrieve all the numbers in a string-- in the console, it displays as multiple lines: $ echo "Sink 0: reference = 0: 153% 1: 45%, real = 0: 62%" | grep -o * 0... (4 Replies)
Discussion started by: johnywhy
4 Replies

4. Shell Programming and Scripting

How to display when nth line match a pattern?

Hi All, I have sample of listing as following Database 2 entry: Database alias = PXRES Database name = PXRES Local database directory = /db2/data1/db2phnx Database release level = d.00 Comment ... (3 Replies)
Discussion started by: ckwan
3 Replies

5. UNIX for Dummies Questions & Answers

Commenting a line matched with a specific string in a file

Hi, I would like to comment a line that matched a string "sreenivas" in a file without opening it. Thanks in advance. Regards, Sreenivas (3 Replies)
Discussion started by: raosr020
3 Replies

6. Shell Programming and Scripting

Print only matched string instead of entire line

Hi, I have a file whose lines are something like Tchampionspsq^@~^@^^^A^@^@^@^A^A^Aÿð^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^?ð^@^@^@^@^@^@^@?ð^@^@^@^@^@^@pppsq^@~^@#@^@^@^@^@^@^Hw^H^@^@^@^K^@^@^@^@xp^At^@^FTtime2psq^@ ~^@^^^A^@^@^@^B^A I need to extract all words matching T*psq from the file. Thing is... (4 Replies)
Discussion started by: shekhar2010us
4 Replies

7. Shell Programming and Scripting

Help required on joining one line above & below to the pattern matched string line.

Hi Experts, Help needed on joining one line above & below to the pattern matched string line. The input file, required output is mentioned below Input file ABCD DEFG5 42.0.1-63.38.31 KKKK iokl IP Connection Available ABCD DEFG5 42.0.1-63.38.31 ... (7 Replies)
Discussion started by: krao
7 Replies

8. UNIX for Advanced & Expert Users

capture data from matched string/line

Hi, I have a query as follows : suppose I am matching a string in a file say "start from here" and I want to pick up 'n' number of lines () from the matched string. Is there any way to do that ? 1) going forward I want to do this for every match for the above string 2) or limit this to... (2 Replies)
Discussion started by: sumoka
2 Replies

9. Shell Programming and Scripting

save every line in log file with matched string

i have been doing this script to match every line in a current log file (access_log) with strings that i list from a path (consist of 100 of user's name ex: meggae ).. and then make a directory of every string from the text file (/path/meggae/) --->if it matched.. then print every line from the... (3 Replies)
Discussion started by: meggae
3 Replies

10. Shell Programming and Scripting

Replacing a string in nth line

Hello All, How to replace a string in nth line of a file using sed or awk. For Ex: test.txt Line 1 : TEST1 TEST2 TEST3 Line 2 : TEST1 TEST2 TEST3 TEST4 Line 3 : TEST1 TEST2 TEST3 TEST5 Line 4 : TEST1 TEST2 TEST3 TEST6 Line 5 : TEST1 TEST2 TEST3 TEST7 i want to go to 4th line of a... (1 Reply)
Discussion started by: maxmave
1 Replies
Login or Register to Ask a Question