Scrutinizer,
Your awk line works very well, thank you. I was using a test file for it first but when using it on the actual files, it worked out fine.
Thanks again!
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 2,288
Thanks Given: 430
Thanked 480 Times in 395 Posts
Hi.
This longish post is intended to show a general technique for working with paragraphs or stanzas of data. Each stanza is transformed so that a copy of it becomes a single, standard text line, embedded newlines are converted to some other character (in the specific case "|"). This creates an intermediate structure that one could call a super-line.
The super-lines are then manipulated to obtain a final set of super-lines that conform to the requirements. Finally, the super-lines are split back to normal, and final filtering can be done.
This script performs that combination of operations. The creation of super-lines can be done with awk, perl, etc. I used a perl utility from github called cat0par (see script for link). The script also uses a few local tools such pll, specimen, etc.
Code:
#!/usr/bin/env bash
# @(#) s1 Demonstrate join / split of super-line to search embedded string.
# See:
# https://github.com/jakobi/script-archive/blob/master/cli.list.grep/cat0par
# or:
# https://raw.githubusercontent.com/jakobi/script-archive/master/cli.list.grep/cat0par
# 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() { : ; }
pe
what $( which pll cat0par )
C=$HOME/bin/context && [ -f $C ] && $C specimen cat0par grep sed pll
FILE=${1-data1}
pl " Sample input data file $FILE:"
specimen 5 $FILE
# Collect and join all lines in an "interface" stanza into a super-line.
# Select "move-group: super-lines.
# Omit "filter-shared 14" super-lines.
# Split super-lines back into stanzas.
# Select "interface" lines.
rm -f f[1-9]
pl " Results:"
cat0par -nl -nonl='|' -start "interface" $FILE |
tee f1 |
grep "move-group" |
tee f2 |
grep -v "filter-shared 14" |
tee f3 |
sed 's/|/\n/'g |
tee f4 |
grep "interface"
pl " Content of intermediate files:"
pll f?
exit 0
producing:
Code:
$ ./s1
pll Print long-line, section, trim, shorten to width as necessary.
cat0par Combine/split lines to stanza/groups/superlines.
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
specimen (local) 1.17
cat0par (local) 1.3
grep GNU grep 2.5.3
sed GNU sed version 4.1.5
pll (local) 1.22
-----
Sample input data file data1:
Edges: 5:0:5 of 27 lines in file "data1"
interface 1/1/1/0 move-group
decription one one one zero
no shut
filter-shared 14
accounting-policy 5
---
interface 1/1/1/4 permanent-group
decription one one one four
no shut
accounting-policy 5
shared-address 0
-----
Results:
interface 1/1/1/1 move-group
interface 1/1/1/3 move-group
-----
Content of intermediate files:
(Longest line: 143; fit into lines of length 78)
1 2 3 ... 11 12 13
12345678901234567890123456789012345...78901234567890123456789012345678901
FILE = f1
interface 1/1/1/0 move-group| d...unting-policy 5| shared-address
interface 1/1/1/1 move-group| d...unting-policy 5| shared-address
interface 1/1/1/2 move-group| d...unting-policy 5| shared-address
interface 1/1/1/3 move-group| d...unting-policy 5| shared-address
interface 1/1/1/4 permanent-group| ...unting-policy 5| shared-address
FILE = f2
interface 1/1/1/0 move-group| d...unting-policy 5| shared-address
interface 1/1/1/1 move-group| d...unting-policy 5| shared-address
interface 1/1/1/2 move-group| d...unting-policy 5| shared-address
interface 1/1/1/3 move-group| d...unting-policy 5| shared-address
FILE = f3
interface 1/1/1/1 move-group| d...unting-policy 5| shared-address
interface 1/1/1/3 move-group| d...unting-policy 5| shared-address
FILE = f4
interface 1/1/1/1 move-group
decription one one one one
no shut
accounting-policy 5
shared-address 0
interface 1/1/1/3 move-group
decription one one one three
no shut
accounting-policy 5
shared-address 0
The intermediate files are displayed to show the progress of the operation. They can be omitted for production work.
sed -n '
:loop
N
/\ninterface/!{
$!{
s/\n/:/
b loop
}
s/$/\
/
}
/filter-shared 14/!{
s/:.*\n/\
/
P
}
s/.*\n//
b loop
' file
Narrative: Set a branch tag 'loop' for looping, add another input line to the buffer, if the final line in the buffer is not an interface line then if it is not EOF then turn the linefeed into a colon and go back to loop else for EOF put a linefeed on the end of the line, then if there is no key string in the buffer, remove all but the interface lines and print the first interface line, discard the first line(s) in the buffer and loop back for more lines.
I have two files and desire to use the strings from $1 of file 1 (file1.txt) as search criteria to find matches in $2 of file 2 (file2.txt). If matches are found I want to output the entire line of file 2 (file2.txt) followed by fields $2-$11 of file 1 (file1.txt). I can find the matches, I cannot... (7 Replies)
The below awk in bold will look for the ids in file1 in $2 of file2 and if they match print the line in file2. If an id is missing or not found in file2 (like BMPR2 in line4 of file1) I can not figure out how to add it to them to the lines in the output as missing in $3 following the same format.... (4 Replies)
I have a list of countries and I'm trying to print the country names that start with "A" and end in "a".
I can do the first one which gives me the correct output.
awk '/^A/ {print $1}' countries.txt
but when I try:
awk '/^A a$/ {print $1}' countries.txt
or even:
awk... (2 Replies)
I have a file with many lines which contain strings like .. etc.
But with no rule regarding field separators or anything else.
I want to print ONLY THE STRING from each line , not the entire line !!!
For example from the lines :
Flow on service executed with success in . Performances... (5 Replies)
Hello,
I can extract lines in a file, between two strings but only one time.
If there are multiple occurencies, my command show only one block.
Example, monfichier.txt contains :
debut_sect
texte L1
texte L2
texte L3
texte L4
fin_sect
donnees inutiles 1
donnees inutiles 2
... (8 Replies)
Hi,
I have a file filled with search strings which have a blank in between and look like this:
S. g. Ehr.
o. Jg.
v. d. Chijs
g. Ehr.
Now i would like to search for the strings and it also shall return the next column after the match.
awk -v FILE="search_strings.txt" 'BEGIN {... (10 Replies)
Hi to everyone,
Please some help over here.
Hi have array a with 6 elements and array b with 3 elements as shown inside BEGIN{} statement.
I need help to get the correct sintax (the part in red) to compare if string from array b is in array a and print the number
related for each match.... (3 Replies)
hi everyone,
1.txt
981 I field1 > field2.a: aa, ..si01To:<f:a@a.com>From: <f:a@a.com>;tag=DVNgfRZBZRMi96 <f:a@1:333>;ZZZZZ: 12345
the output
field1 field2 <f:a@a.com>
the output is cut the string 3rd and 5th field, and get the value betwee "To:" and "From:", please advice.
... (1 Reply)
Hi,
I want to print only lines in between two strings and not the strings using awk.
Eg:
OUTPUT
top 2
bottom 1
left 0
right 0
page 66
END
I want to print into a new file only
top 2
bottom 1
left 0... (4 Replies)