2

我有以下问题:

我有一个名为 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,但结果只是每个水果的第一道),例如:

所以我尝试使用以下命令:

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

它有效......但一次只有一个条目......

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

我试图把它放在一个“for循环”中,但它不起作用。

你们有什么帮助吗?

4

3 回答 3

1

试试这个 awk 单线:

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

然后检查生成的 results.txt。

于 2013-07-04T12:16:48.217 回答
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
于 2013-07-04T12:17:00.733 回答
0

带有while循环的 bash 解决方案:

while read fruit ; do
    sed -n "/^$fruit/,/^>/p" fruits.txt \
    | head -n-1
done < list.txt
于 2013-07-04T12:17:19.870 回答