将sed置于“for cycle”中

时间:2013-07-04 12:07:29

标签: bash for-loop sed grep

我有以下问题:

我有一个名为fruits.txt的大文件,如下所示:

>apple
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
>orange
sakalksalksalksalksalksalksalsak
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
>pineapple
sakalksalksalksalksalksalksalsak
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk

我在list.txt中有一个我想要的水果列表,如下所示:

>orange
>apple
>pineapple
>etc.

我想要做的是grep“list.txt”中包含的所有单词,这些单词可以出现在fruits.txt中,并放入一个看起来像这样的result.txt文件:

>orange
sakalksalksalksalksalksalksalsak
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk

不幸的是我已经尝试过了 fgrep -f list.txt fruits.txt,但结果只是每个水果的第一个通道),如:

  

所以我尝试使用以下commnad:

sed -n -e '/orange/,/>/ p' fruits.txt | sed '$d' > results.txt

并且它有效...但是只有一个条目...

我的想法是用list.txt替换'/orange/

我试图把它放在“for cycle”中,但它不起作用。

你们的帮助吗?

3 个答案:

答案 0 :(得分:1)

尝试这个awk one-liner:

awk 'NR==FNR{a[$0];next}/^>/{f=$0 in a}f{print > "results.txt"}' list.txt fruits.txt

然后检查生成的results.txt。

答案 1 :(得分:1)

您可以考虑使用while

$ while read fruit; do sed -n -e "/$fruit/,/>/ p" fruits.txt | sed '$d' ; done < list.txt
>orange
sakalksalksalksalksalksalksalsak
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
>apple
dslksdlksdlsdksdsdlkdlsdksdsdsdk
ksdlsdlskdlsdklsdksdlksdlkdlksdk
>pineapple
sakalksalksalksalksalksalksalsak
dslksdlksdlsdksdsdlkdlsdksdsdsdk

答案 2 :(得分:0)

使用while循环的bash解决方案:

while read fruit ; do
    sed -n "/^$fruit/,/^>/p" fruits.txt \
    | head -n-1
done < list.txt