![]() |
Can I use grep inside awk?
I have the following file:
www/home/pictures/bird.gif www/home/pictures/home.gif www/home/documents/home.gif I want to filter out the records that have a file name containing "home". I don't want the records with a directory named "home" to be included. To only pick out only the filename, I do this: fn=`echo $tmp | grep '[^\ /]*$' -o` where $tmp is the first record in the file. So, can I do this operation using awk? I have tried something like shown below, but I only get syntax errors (invalid char '`' in expression). Am I not allowed to use grep inside an awk? awk '{ fn=`echo $1 | grep '[^\/]*$' -o` if ( $fn ~/'home'/ ) print $0 }' $myFile > newfile I hope someone can help me out! |
It's really unclear what you're trying to do. You say you want to "filter out" filenames w/'home' in them, but that you don't want "records with a directory named 'home' to be included".
1) by filter out, do you mean to ignore files with 'home' in them or that you want to "work with" files with 'home' in them? 2) all of the directories contain directories named 'home' 3) your regex "[^\ /]*$" matches any input line (see end of this post for why). Also, you needn't escape '/' in a character class - [^/] works fine. 4) what about something with awk -F'/' '{blah blah}' to get at each compenent of the full pathname (whatever it is you're doing :))? the regex "[^/]*$" matches any line which contains zero or more occurences of any character but '/', followed by an end of line marker. Note that even "//////" matches, because [^/]* is in a sense "optional". Think about that one. Also, the -o option puts grep into an endless loop with that regex (at least for me it does). I've never used -o so I'm not familiar with what can go wrong with it. |
Ok, I'll try again.
1) I want to work with the records that actually contain a file with "home" in. I don't want to work with www/home/pictures/bird.gif, and to avoid this I use the regular expression. If I don't use a regular expression, this record will be selected because it has "home" in it. 2)Yes, all the records contain "home", and that's the problem. As mentioned above. 3) As far as I can see, my reg.expr is correct because it only returns the filename. I want to use this filename for further testing in the awk: awk '{ fn=`echo $1 | grep '[^\/]*$' -o` if ( $fn ~/'home'/) print $0 }' $myFile > newfile Any clearer? :( |
You are trying to start the "grep" program from inside a awk script. I'm not very sure, but I think that's not (easily) possible. But it's also doesn't make a lot of sense, since awk is more powerfull than grep. It can do the same, and a lot more, but with different syntax and semantics.
For example if this is "files.txt": Code:
www/home/pictures/bird.gif Code:
awk -F/ '!/\/home\//{print $NF}' files.txt |
Thank you for help! I realise that I should have told you the whole scenario instead of simplify it too much. Sorry :)
This is my actual file: anna;www/home/pictures/bird.gif;23 arna;www/pictures/animal.gif;4 emma;www/home/documents/home.gif;333 kim;www/nothome/somebitmap.gif;123 sarah;www/somedir/pictures/next.gif;43 alf;www/home/documents/home.gif;1 It is semicolon separated, so I can't use field separator you suggested (-F/). Is it possible to put your awk-command inside mine? Like this: awk -F';' '{ fn=`your awk` if ( $fn ~/'home'/ ) print $0 }' $myFile > newfile Again; I want to print out the records that has a filename with "home" in it. |
Now (I think) I understand the "home"-part of the problem, but it's still unclear to me what part of an input line, you want to see in the output.
So here are 3 options: Code:
# Entire line in ouput. I this case you can also use grep. |
Thank you, Hko.
The first option seems to be the right one in my case. I didn't get the idea about not using the field-separator! |
cat files.txt
www/home/pictures/bird.gif www/home/pictures/home.gif www/home/documents/home.gif awk -F / '{tmp=match($NF,/home/);if(tmp) print}' files.txt This gives you the below www/home/documents/home.gif www/home/documents/home.gif |
This gives the same o/p as Hko's num 1
Code:
for rec in $(cat t.t) |
In case you missed it, I just want to point out that you are responding to a thread from 2004(!).
Best regards, HMW |
yeah - I missed it
|
All times are GMT -5. The time now is 10:00 PM. |