AnnieFrannie
AnnieFrannie

Reputation: 53

How to use the output from sed command as a string and use that string in the grep command?

I have a file with only one string per row, "File1", and a file that has two strings per row, "File2". I wan't go through File1 and check for every row/string in how many of the rows in File2 it appear.

I would like to use something like this:

grep '{sed -n 1p File1}' File2

But it doesn't work. Why and what should I do?

//Thanks!

Upvotes: 0

Views: 417

Answers (1)

simlev
simlev

Reputation: 929

It seems to me that you're asking two completely different questions: one in the title and one in the body. I'll try to summarize them and answer both.

First question:

How to use the output from sed command as a string and use that string in the grep command?

First answer:

The unix way is to pipe a command's output as input to another program. If you instead want to use the first program's output as e.g. a parameter to the subsequent command (not as its input), there's a handy program that allows you to do just that: xargs.

Example of piping the sed output as input to grep:

sed -n 1p File1 | grep 'needle'

Example of using the sed output as a search string for grep:

sed -n 1p File1 | xargs -I{} grep {} File2

Second question:

I have a file with only one string per row, "File1", and a file that has two strings per row, "File2". I wan't go through File1 and check for every row/string in how many of the rows in File2 it appear.

Second answer:

awk 'NR==FNR{!a[$0]++;next} $1 in a{a[$1]++} END{for(i in a){print i" "a[i]-1}}' File1 File2

Test files:

==> File1 <==
one
two
three

==> File2 <==
one apple
two bananas
two strawberries
three kiwis
three pomegrenades
three lychees

Test run output:

three 3
two 2
one 1

That's only if you mean the string from File1 to appear as the first column of File2. For a more general approach, where you want to count every File2 row containing the string from File1:

awk 'NR==FNR{!a[$0]++;next} {for(i in a){if(match($0,i)){a[i]++}}} END{for(i in a){print i" "a[i]-1}}' File1 File2

Test files:

==> File1 <==
one
two
three

==> File2 <==
one one
two one
two two
three three
three two
three one

Test run output:

three 3
two 3
one 3

Upvotes: 2

Related Questions