sdf
December 16, 2011, 3:25pm
1
I would like to search for strings stored in searchstringfile.txt in inputfiles.
searchstringfile.txt
J./F.
Gls. Wal
F.
Tower
input1.txt
What is needed is J./F. 12 var Gls. Wal 16 interp. Tower 12
input2.txt
Awk shall search for F. 16 pt. J./F. 22
output.txt
input1.txt J./F. = 12 var
input1.txt Gls. Wal = 16 interp.
input1.txt Tower = 12
input2.txt F. = 16 pt.
input2.txt J./F. = 22
This is the most i came up with:
awk 'NR==FNR { A[$0]; }{for(N=1; N<=NF; N++) if(A[$N]) print( FILENAME, $N " = " $(N+1)); }' searchstringfile.txt input*.txt
awk 'NR==FNR{a[$0]=$0;next}{for(i=1;i<=NF;i++){t=m FS $i;m=$i;s(m,a);s(t,a)}}function s(x,b){if(x in b){print FILENAME,x,"=",$(i+1),$(i+2);i=i+2}}' searchstringfile.txt input*.txt
input1.txt J./F. = 12 var
input1.txt Gls. Wal = 16 interp.
input1.txt Tower = 12
input2.txt F. = 16 pt.
input2.txt J./F. = 22
sdf
December 17, 2011, 2:30am
3
yinyuemi:
awk 'NR==FNR{a[$0]=$0;next}{for(i=1;i<=NF;i++){t=m FS $i;m=$i;s(m,a);s(t,a)}}function s(x,b){if(x in b){print FILENAME,x,"=",$(i+1),$(i+2);i=i+2}}' searchstringfile.txt input*.txt
input1.txt J./F. = 12 var
input1.txt Gls. Wal = 16 interp.
input1.txt Tower = 12
input2.txt F. = 16 pt.
input2.txt J./F. = 22
The code produces always the first two instances after the searchstring and it shall not return the second instance of a searchstring.
Simply it shall only return the strings between two searchstrings.
Strings in which to be searched:
input1.txt: What is needed is J./F. 12 var II Gls. Wal 16 Tower 11 interp.
input2.txt: Awk shall search for F. 16 J./F. 22 pt.
Ouput:
input1.txt J./F. = 12 var II
input1.txt Gls. Wal = 16
input1.txt Tower = 11 interp.
input2.txt F. = 16
input2.txt J./F. = 22 pt.
You may try something like this:
awk 'NR == FNR { r = r ? r "|" $0 : $0; next }
{
s = $0; c = 0; split(x, rs); split(x, rl)
while (match(s, r) > 1) {
rs[++c] = RSTART; rl[c] = RLENGTH
s = substr(s, RSTART + RLENGTH)
}
for (i = 0; ++i <= c;) {
printf "%s: %s = %s\n", FILENAME, substr($0, rs, rl), \
(rs[i + 1] - 2 > 0 ? substr($0, rs + rl, rs[i + 1] - 2) : \
substr($0, rs + rl))
$0 = substr($0, rs + rl)
}
}' searchstringfile.txt input1.txt input2.txt
With GNU awk 4 it's easier:
awk 'NR == FNR { r = r ? r "|" $0 : $0; next }
{
n = patsplit($0, cr, r, s)
for (i = 0; ++i <= n;)
printf "%s: %s = %s\n", FILENAME, cr, s
}' searchstringfile.txt input1.txt input2.txt