How to find a string in a line in UNIX file and delete that line and previous 3 lines ?


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users How to find a string in a line in UNIX file and delete that line and previous 3 lines ?
# 1  
Old 05-16-2014
How to find a string in a line in UNIX file and delete that line and previous 3 lines ?

Hi ,

i have a file with data as below.This is same file. But actual file contains to many rows.

i want to search for a string "Field 039 00" and delete that line and previous 3 lines in that file.. Can some body suggested me how can i do using either sed or awk command ?

Code:
 
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 00
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 91
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 00
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 91
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 00
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 00
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253
Field 039 00
Field 004 000000000100
Field 007 1125112233
Field 102 7000005253

Thanks,
Venkat Vadlamudi.

Moderator's Comments:
Mod Comment Please use code tags next time for your code and data. Thanks

Last edited by vbe; 05-16-2014 at 10:27 AM.. Reason: code tags
# 2  
Old 05-16-2014
Try
Code:
tac file | awk '/Field 039 00/ {L=NR+3} NR>L' | tac

# 3  
Old 05-16-2014
Here is another solution:
Code:
#! /bin/bash


awk ' BEGIN {i=0;}
        /Field 039 00/ { count = 0 ; next}
        {
        Store[i]=$0;
        i = (i+1) % 4;
        if (count < 3)
                count++;
        else
                print Store[i];
        }
        END {
                while (count--) {
                i = (i+1) % 4;
                print Store[i];
                }}' data
exit 0

It did not work until I put in the BEGIN block. I have to say I don't understand why. I expected i to just pop into existence with a value of 0. Maybe that doesn't work with subscripts.
# 4  
Old 05-16-2014
Another awk solution by reading input file twice:
Code:
awk '
        NR == FNR {
                if ( $0 ~ /Field 039 00/ )
                        A[NR]
                next
        }
        !((FNR-3) in A) && !((FNR-2) in A) && !((FNR-1) in A) && !(FNR in A)
' file file

# 5  
Old 05-16-2014
Quote:
Originally Posted by Perderabo
Here is another solution:
Code:
#! /bin/bash


awk ' BEGIN {i=0;}
        /Field 039 00/ { count = 0 ; next}
        {
        Store[i]=$0;
...

It did not work until I put in the BEGIN block. I have to say I don't understand why. I expected i to just pop into existence with a value of 0. Maybe that doesn't work with subscripts.
AWK's arrays are associative and its subscripts are strings. i does pop into existence, but, in that string context, its undefined value is converted to an empty string.
Code:
awk 'BEGIN { a[i]=5; print "ZERO: " a[0]; print "EMPTY: " a[""]}'
ZERO: 
EMPTY: 5

An alternative fix would be to cast i to a numeric, Store[i+0]=$0, before AWK automatically casts it back to a string (technically there is no cast, as the variable can have both string and numeric values at the same time and the implementation simply chooses which to use depending on context).

Regards,
Alister
This User Gave Thanks to alister For This Post:
# 6  
Old 05-16-2014
If it is always sets of 4 lines, then this might also do:
Code:
sed '$!N;$!N;$!N;/\nField 039 00$/d'

# 7  
Old 05-17-2014
Hi.

A grep relative, cgrep, can do this:
Code:
#!/usr/bin/env bash

# @(#) s1	Demonstrate match+previous 3, then invert to delete; cgrep.
# See: http://sourceforge.net/projects/cgrep/

# Utility functions: print-as-echo, print-line-with-visual-space, debug.
# export PATH="/usr/local/bin:/usr/bin:/bin"
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C column cgrep

FILE=${1-data1}

pl " Input data file $FILE (columnized):"
column $FILE

pl " Results:"
cgrep -D -V -3 fig $FILE

exit 0

producing:
Code:
$ ./s1

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 2.6.26-2-amd64, x86_64
Distribution        : Debian 5.0.8 (lenny, workstation) 
bash GNU bash 3.2.39
column - ( /usr/bin/column, 2007-11-20 )
cgrep ATT cgrep 8.15

-----
 Input data file data1 (columnized):
apple		date		kiwi		nectarine	rhubarb
banana		fig		lemon		orange
cherry		grape		mango		peach

-----
 Results:
apple
grape
kiwi
lemon
mango
nectarine
orange
peach
rhubarb

See sourceforge page for details. It will need to be compiled, but I had no trouble with that.

Best wishes ... cheers, drl
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to find string and delete before just in line?

Hello, When my lines contain question mark, I use below command to delete the portion of the matching line coming after question mark: sed 's/?.*//' SampleFile SampleFile: helloworldfirstline?mdksmyymsss hellosecondlineworld?mdksmkkmsss thirdhelloworld?mdksmccmsss Output:... (2 Replies)
Discussion started by: baris35
2 Replies

2. Shell Programming and Scripting

Delete all lines except a line starting with string

Shell : bash OS : RHEL 6.8 I have a file like below. $ cat pattern.txt hello txt1 txt2 txt3 some other text txt4 I want to remove all lines in this file except the ones starting with txt . How can I do this ? (4 Replies)
Discussion started by: omega3
4 Replies

3. Shell Programming and Scripting

Remove previous line if next & previous lines have same 4th character.

I want to remove commands having no output. In below text file. bash-3.2$ cat abc_do_it.txt grpg10so>show trunk group all status grpg11so>show trunk group all status grpg12so>show trunk group all status GCPKNYAIGT73IMO 1440 1345 0 0 94 0 0 INSERVICE 93% 0%... (4 Replies)
Discussion started by: Raza Ali
4 Replies

4. Shell Programming and Scripting

Sed find exact string and delete line with variable

All, I am trying to read in a variable and search a file then delete based on that string, but i want to match exact word. This works but it matches all, i don't want to match anthing that contains the string, just the exact string. sed -i "/$feedname/d" file I tried sed... (1 Reply)
Discussion started by: markdjones82
1 Replies

5. Shell Programming and Scripting

Delete line with match and previous line quoting/escaping problem

Hi folks, I've list of LDAP records in this format: cat cmmac.export.tmp2 dn: deviceId=0a92746a54tbmd34b05758900131136a506,ou=devices,ou=customer,ou=nl,o=upc cmmac: 00:13:11:36:a5:06 dn: deviceId=0a92746a62pbms4662299650015961cfa23,ou=devices,ou=customer,ou=nl,o=upc cmmac:... (4 Replies)
Discussion started by: tomas.polak
4 Replies

6. Shell Programming and Scripting

Grep a string from input file and delete next three lines including the line contains string in xml

Hi, 1_strings file contains $ cat 1_strings /home/$USER/Src /home/Valid /home/Review$ cat myxml <projected value="some string" path="/home/$USER/Src"> <input 1/> <estimate value/> <somestring/> </projected> <few more lines > <projected value="some string" path="/home/$USER/check">... (4 Replies)
Discussion started by: greet_sed
4 Replies

7. Shell Programming and Scripting

Find pattern a delete previous 5 lines

Hi guys, i have the follow problem i need to delete 10 row before the pattern and 1 after and the pattern row itself. file looks like: frect 9.8438 25.8681 10.625 25 . dynprop \ (# \ (call fox_execute(__self))) \ (FOX_VAR_29 \ ... (4 Replies)
Discussion started by: EjjE
4 Replies

8. Shell Programming and Scripting

Unix help to find blank lines in a file and print numbers on that line

Hi, I would like to know how to solve one of my problems using expert unix commands. I have a file with occasional blank lines; for example; dertu frthu fghtu frtty frtgy frgtui frgtu ghrye frhutp frjuf I need to edit the file so that the file looks like this; (10 Replies)
Discussion started by: Lucky Ali
10 Replies

9. Shell Programming and Scripting

How to use sed to search for string and Print previous two lines and current line

Hello, Can anybody help me to correct my sed syntax to find the string and print previous two lines and current line and next one line. i am using string as "testing" netstat -v | sed -n -e '/test/{x;2!p;g;$!N;p;D;}' -e h i am able to get the previous line current line next line but... (1 Reply)
Discussion started by: nmadhuhb
1 Replies

10. Shell Programming and Scripting

find previous line, next line on solaris

Hi, Unlike the GNU version, grep on SunOS doesn't have the switches -B and -A to fetch me the lines before n after the match and looking for an alternate way. Any Suggestions?. -Anduzzi (1 Reply)
Discussion started by: anduzzi
1 Replies
Login or Register to Ask a Question