我有以下问题:
我有一个名为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”中,但它不起作用。
你们的帮助吗?
答案 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