2012-01-19 7 views
1

複数のファイルから単語のリストを作成したいとします。すべてのファイルにキーワードがあり、その前に一連の単語があります。例:シェルを使用してファイルにアクセスする

Keywords: engine, motor, car, etc. 

シェルスクリプトを使用してすべての単語のリストを作成します。コメントから

それはメールを含むテキストファイルのセットです。私はこれらのキーワードから単語の袋のようなものを構築したい

Keywords: photo, camera, color 

:すべてのファイルは、次のような行を持つヘッダを持っています。つまり、結局私は単語の配列を持っていたいと思います。

+0

あなたは手の込んだことができ、チェックマーク記号を押すことで、もしあれば、最高のは、あなたの問題を解決する答えを受け入れるようにファイルの構文について?それは "と" motor foo bar "のようなものですか? – jkj

+0

"その前に単語の集合 "がありません。入力は何ですか? –

+0

電子メールを含む一連のテキストファイル。すべてのファイルには、次のような行のヘッダーがあります:Keywords:photo、camera、color。これらのキーワードから単語の袋を作りたいと思います。 – Cyang

答えて

1

(私は本当にあなたがUNIX/Linuxベースのシェルを意味願っています)

それはあなたが予想される入力の例を含めるように自分の投稿を編集した場合、合理的な答えを得るために、将来に役立つ(2小さなサンプルファイルは次のようになり完璧な)とあなたはあなたのために必要な出力 '単語のバッグ'。また、質問には5つのタグを使用することができるので、基本的なOSをunix/linux/Windows/otherと指定してください。可能なプログラミング言語です。タグにカーソルを合わせると、そこにフォロワーがいくつあるかがわかります。わずかな信者で貴重なタグを無駄にしないでください。 (あなたがそれをしたわけではない)。追随者が多いほど、あなたを助ける人がいる可能性が高くなります。

cat carFile 
other stuff 
Keywords: engine, motor, car 
other stuff 

cat cameraFile 
other stuff 
Keywords: photo, camera, color 
more other stuff 
Keywords: road, highway, oinker 
final other stuff 


awk '{ 
     if ($0 ~ /Keywords:/) { 
     line=$0 
     sub(/Keywords: /, "", line) 
     array[FILENAME] = array[FILENAME] ? array[FILENAME] ", " line : line 
     } 
     } 
     END { 
     for (key in array) { 
      printf("%s:\t%s\n", key, array[key]) 
     } 
     } 
     ' carFile cameraFile 

出力

:2のデータは、あなたのオリジナルメッセージやコメントに含まれている、プラスの言葉のバッグ 'での私の最高の推測では、次のことを提案するために私を導く設定与えられた、と述べた

carFile:  engine, motor, car 
cameraFile:  photo, camera, color, road, highway, oinker 

私は意図的にcar用語をcameraファイルに入れました。 awkスクリプトへの引数としてインクルードするファイルはすべて処理され、入力ファイル名に基づいて 'Keywords:'の行がのリストに追加されます。

注意また、あなたが簡単に

 for (key in array) { 
      printf("%s\n", array[key]) 
     } 
のように、単にEND文で出力処理からのことを排除することによって、(SOURCEFILE名を表示せずに)キーワード行から取得された値を表示するために、出力を変えることができること

ファイル名が処理されている現在のファイルに対応して自動的に提供AWK変数であるAWK処理に関するいくつかの詳細。

アレイは、awk連想配列のユーザー定義名です。 'a'または 'arr'、またはawkの変数命名規則(すべてのC言語の派生したvar名規則と同じ)を満たす任意の名前であった可能性があります。

sub(...)は '代入'のawk関数です。私は入力行 '$ 0'を行と呼ばれるvarにコピーしてから、行のキーワード:部分を削除しました。

awkは、最初の '{...}'ブロック内にあるコードを使用して暗黙のループを介してデータを処理します。

我々はif ($0 ~ /Keywords:/)とキーワードである行をスキャンし、条件付きブロックで行だけを処理します。

END { ... }ブロックは、すべての入力ファイルが読み込まれた後にのみ「実行」されます。この場合、キー上の配列を循環し、キー値のペアを出力します。配列の値にデータを追加したので(5行目)、cameraFileに表示されるキーワードの両方が取得されます。

こちらがお役に立てば幸いです。

P.S. StackOverflow(S.O.)へようこそ。灰色の三角形、http://i.imgur.com/kygEP.pngを使用することにより、良好なQ/AについてのFAQ、http://tinyurl.com/2vycnvr、投票を読んですることを忘れないでください、とhttp://i.imgur.com/uqJeW.png

関連する問題