0

私はLinuxマシンを使い始めて、簡単なことをしようとしています...しかし、私にとっては非常に困難です。2番目のファイルで報告されたものと一致するいくつかの特定の行を選択する必要があります。実用的には、次のように作成された最初のファイルがあります。

>aba19  EN1 enl.or11    http://mar2043  annotation not avaliable
MASESEMGVVASJDHAGISFGVDDASDASDAFGDFGHWFACFQLIGIFLAYCLSRAITNN
QSDHKAJSDHKASJHKJAHKHKJSDGHYEIV
>clat38 EN2 enl.o   http://mar20s/Gene/Summary?5    annotation not avaliable
MNCEDCHILNAEAFKSKKDASDADICKSLKICGLVFGILALTLIVLFWGSKHFWPEVPKK
AYDMEHTFYSNGERGYCCASDSDDIYCSDRRGNRYCRRVCEPLLGYYPYPYCYQGGRVIC
RVIMPCDASDASDAOPWEIPQWFHNDJBVHAOISDOUIAODGNWWVARMLGRV
>coll9  EN4 ens4    http://mar2010.arch/Genary?g=E9 annotation not avaliable
MASKALDHLFKLJLÒFJASDJKLASDLAFJLFJFJLFJLAJFLKJFLAKFJFJLAFJLAL
ASDLASKDJASLKDJASLKJFALSKDJALKDJSKLDJLSDKJASLDKJSLDKSDLAKJKS
SILDUAISDALSDJALKDJASDLFATT 
>hihi9  EN9 ens44   http://mar2010.ariens/Geary?g=EN7   annotation not    avaliable
MGSLDLAÈPWOEMWBZMKSJDHAJKSDHAKSDHSDHSDHOASDAKSJDHKASJDHAAKHL
KTLSDKLHRFSDFHPHFGCJLJLJRKKFLDSFCGTVGEFAGGGDTHNNVCLSSVFVSEDG
HSDFSDWFKLGGMETVCSDFKVSQATPEFSSSDLFFDSRIQSIRDPASIPPEEMSPEFTT
LPECHGHARDAFSFGTLVESLLTILNEQVSADVLSSFQQTLHSTLLNPIPKCRPALCTLL
SDFLSDJFKLSDFLSKDFJM

そして、最初のファイルから「抽出」する必要のあるパターンのリストを含む2番目のファイルがあります。2番目のファイルは次のようになります。

>clat38
>coll9

実用的には、次のような出力が必要です。

>clat38 EN2 enl.o   http://mar20s/Gene/Summary?5    annotation not avaliable
MNCEDCHILNAEAFKSKKDASDADICKSLKICGLVFGILALTLIVLFWGSKHFWPEVPKK
AYDMEHTFYSNGERGYCCASDSDDIYCSDRRGNRYCRRVCEPLLGYYPYPYCYQGGRVIC
RVIMPCDASDASDAOPWEIPQWFHNDJBVHAOISDOUIAODGNWWVARMLGRV
>coll9  EN4 ens4    http://mar2010.arch/Genary?g=E9 annotation not avaliable
MASKALDHLFKLJLÒFJASDJKLASDLAFJLFJFJLFJLAJFLKJFLAKFJFJLAFJLAL
ASDLASKDJASLKDJASLKJFALSKDJALKDJSKLDJLSDKJASLDKJSLDKSDLAKJKS
SILDUAISDALSDJALKDJASDLFATT

私は試しましgrep -f file_2 file_1 > outputたが、これしか得られません:

>clat38
>coll9

grepに固有の何かを追加できますか?アドバイスありがとうございます!Gab

4

4 に答える 4

2

1 行で正規表現を検索するには、grep を使用します。manページといくつかの例からそれを学んでください。

1 行の正規表現を文字列に置き換えるには、sed を使用します。manページといくつかの例からそれを学んでください。

他のすべてのテキスト処理アプリケーションでは、awk を使用します。Arnold Robbins 著『Effective Awk Programming, Third Edition』( http://www.oreilly.com/catalog/awkprog3/ ) から学んでください。

awk 'NR==FNR{a[$0];next} $1 in a{c=2} c&&c--' file2 file1

必要なキーが見つかったときに 2 行以上を出力したい場合は、c の値を 3 または 20 などに変更します。

以下のコメントと更新されたサンプル入力を考えると、これはあなたが望むことをするはずです:

awk 'NR==FNR{a[$0];next} /^>/{f=0} $1 in a{f=1} f' file2 file1
于 2013-02-15T13:15:38.497 に答える
1

grepのマンページから:

-A NUM, --after-context=NUM
          Print NUM  lines  of  trailing  context  after  matching  lines.
          Places  a  line  containing  --  between  contiguous  groups  of
          matches.

したがって、この場合、-A1を追加するだけで機能するはずです。

コメントから、より良い解決策は次のようになります。

grep -xFA1 -f file_2 file_1 | grep -v "^\--"

-x行全体に一致する

-Fパターンを正規表現ではなく文字列として扱います

余分な--行を削除するには、2番目のgrepステートメントを追加する必要がありました。

于 2013-02-15T13:20:16.757 に答える
0
awk 'FNR==NR{a[$0];next}{for(i in a)if(i==$0){print;getline;print}}' second_file first_file

以下でテスト済み:

> cat temp
>aba19
 ALKSDJASDKASDLKASDL
>clat38
 PDASODJADASLDKALSKDLACASDLKAJ
>coll9
 AOSODADALSDKALDKASLDSAK
>hihi9
 JHASDASDJOASDJAOSD

> cat temp2
>clat38
>coll9

> awk 'FNR==NR{a[$0];next}{for(i in a)if(i==$0){print;getline;print}}' temp2 temp
>clat38
 PDASODJADASLDKALSKDLACASDLKAJ
>coll9
 AOSODADALSDKALDKASLDSAK
> 
于 2013-02-15T13:40:44.233 に答える
0

awk ワンライナーがうまくいくはずです:

awk 'NR==FNR{a[$0];next}{x=$0;getline;if(x in a)print x"\n"$0}' file2 file1

kent$  head file1 file2
==> file1 <==
>aba19
 ALKSDJASDKASDLKASDL
>clat38
 PDASODJADASLDKALSKDLACASDLKAJ
>coll9
 AOSODADALSDKALDKASLDSAK
>hihi9
 JHASDASDJOASDJAOSD

==> file2 <==
>clat38
>coll9

kent$  awk 'NR==FNR{a[$0];next}{x=$0;getline;if(x in a)print x"\n"$0}' file2 file1
>clat38
 PDASODJADASLDKALSKDLACASDLKAJ
>coll9
 AOSODADALSDKALDKASLDSAK
于 2013-02-15T13:14:46.517 に答える