2017-02-27 4 views
2

私の質問には、以下に関するいくつかの出力ファイルに一致しますFileB)。grepを一つのファイルにしてソートが

FileB: 
Programmer 
Chemist 
Physcist 

私は今、何をしたいか

がFILEAからすべてのジョブ・クラスを取得し、各Job-のために新しいファイルを作成している(FILEAは、より多くの人々と冗長な情報で延々と続くと仮定)クラス私は最後になるように:

FileProgrammer 
Peter Programmer 
John Programmer 
Alex Programmer 

FileChemist 
Frank Chemist 
Harold Chemist 
George Chemist 

FilePhysicist 
Charles Physicist 

私はジョブズファイルのリストからジョブ名のパターンをgrepや他の元のファイルに存在するすべてのジョブ名の新しいファイルを作成したいです。

実際には私のリストには56個のユニークエレメントがあり、元のファイルには複数のカラム(タブ区切り)があります。

私が何をしたか、これまでだったこの:

cut -f2 | sort | uniq > Jobs 
grep -f(tr '\t' '\n' < "${Jobs}") "${FileA}" > FileA+"${Jobs}" 

私はそれぞれの新しいパターンに新しいファイルが作成される一致していることを想定したが、私は増分または反復一切ありませんので、それだけでファイルをコピーすることを実現ファイルの作成。

私のbashの経験はまだ深く開発されていないので、皆さんが私を助けてくれることを願っています。前もって感謝します。

@Update: 入力ファイルは次のようになります。基本的に

4 23454 22110 Direct + 3245 Corrected 
3 21254 12110 Indirect + 2319 [email protected] 
11 45233 54103 Direct - 1134 Not-Corrected 

、私は修正さの7列にステータスがあり、すべてが修正され、その列のすべてのユニークな値のためにという名前のファイルになりたいですあなたの質問のFILEAにあなたが「Physicisを書いたことを

for i in $(cat FileB); do grep $i$ FileA >> File$i; done 

注:7.

+0

なぜ「grep」でこれをやりたいのですか? 'awk'を使用できますか? – Inian

+0

もちろん、私はawkを使うことができます - 私はループコンテキストでawkの機能に精通していません。私はいくつかのawkループを試しましたが、やや失敗しました。 – chrys

+0

'Awk'と私の答えを試してください – Inian

答えて

1

あなたは、ループ内のgrepでそれを行うことができますt "に、FileBでは" Physcist "と書いてあるので、一致しません。いずれにしても、両方を適切に書くと、上記のコマンドが機能します。

+0

ありがとう、ラインは非常にうまくいった。入力ミスを申し訳ありません。唯一のことは、_grep_がパターンに一致するときに非常に粗いと思われることです。たとえば、仕事がChemist-Biochemistなら、_grep_はそれを他の化学者と共にファイルに入れ、別のChemist-Biochemistファイルを作成しません。それを修正する方法についてのアドバイスはありますか?私は_Awk_が提案されているのを見ましたが、残念ながら_Awk_コードを理解するのは難しいです。 – chrys

+0

@chrys:その部分は分かりませんが、そこにあるすべてのビットを説明しようとしました。 – Inian

+0

@chrys私はコマンドを編集して、文字列の終わりを避けるために文字列を終わらせるようにしました。それが今作動するかどうか点検しなさい。 –

2

答えは

awk '{unique[$2]=(unique[$2] FS $1)}\ 
END {for (i in unique) { \ 
     len=split(unique[i],temp); \ 
     for (j=1;j<=len;j++) print temp[j],i > "File"i".txt"} }' \ 
file 

アイデアは、文字通り意味unique[$2]=(unique[$2] FS $1)、と、ハッシュマップを作成するよう$2を治療することで、ここでは、の必要性のAwkのために懇願あなたがそれを行う方法です配列uniqueのインデックスと$1の値が追加されているので、入力ファイルの各行処理の最後に配列は次のようになります。

# <key> <value(s)> 
Chemist Frank Harold George 
Physicist Charles 
Programmer Peter John Alex 

END句はすべての行が処理された後に実行されるので、単一のwhistespaceで分割するsplit()関数を使用して構築された配列から、配列値の内容を配列tempに格納し、lenに数値分割後の要素の数。

ハッシュインデックスごとにループが作成され、split要素ごとに値が出力され、ファイルに格納されます。

+0

ありがとうございました。クイック質問:あなたの_Awk_スクリプトは、検索するファイルに1行に1つの名前しかないと仮定していますか?私はこれを例として使用しましたが、現実には、_grep_または_awk_によって "ソート"するための7列幅のファイルがあります。ハッシュマップを作成すると、配列で表される行に割り当てられたすべてのキーを持つ配列のハッシュを作成する必要がありますか?ファイルの例: '27 Hatfield Peter London 4 8 Programmer' - タブは区切り文字です。 – chrys

+0

質問に実際に入力してください。 – Inian

関連する問題