2017-02-27 115 views
2

我的問題涉及: 我有一個文件:一個文件和排序的grep匹配幾個輸出文件

FileA: 
Peter Programmer 
Frank Chemist 
Charles Physicist 
John Programmer 
Alex Programmer 
Harold Chemist 
George Chemist 

我現在得到了FILEA所有作業信息,並將其保存到一個唯一列表( FILEB)。

FileB: 
Programmer 
Chemist 
Physcist 

(假設FILEA的推移和與更多的人,冗餘信息)

我想現在要做的就是從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列中的狀態命名修正和一切,所以列的每一個獨特的價值7.

+0

你爲什麼要用'grep'來做這個?你可以使用awk嗎? – Inian

+0

當然,我可以使用awk - 我只是不熟悉awk在循環上下文中的功能。我嘗試了一些awk循環,但有些失敗。 – chrys

+0

用'Awk'試一下我的答案 – Inian

回答

1

你可以用grep做一個循環中:

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

注意,在你的問題的FILEA你寫「Physicis t「,並在FileB中寫入」Physcist「,所以它們不匹配。無論如何,如果你把它們都寫得恰到好處,上面的命令將起作用。

+0

謝謝,這條線路運行得非常好。對不起,錯字。唯一的事情是_grep_在匹配模式時似乎很粗糙。例如,如果工作是化學生物化學家,_grep_會將其與其他化學家一起存檔,而不會創建另一個化學家 - 生物化學家檔案。任何進一步的建議如何糾正?我看到_Awk_被提出,但我很難理解_Awk_代碼。 – chrys

+0

@chrys:什麼部分,你不明白?試圖解釋那裏的每一點。 – Inian

+0

@chrys我編輯了這個命令來強制爲了避免這種情況而對字符串的末尾進行grepped。檢查它現在是否有效。 –

2

答案渴望的需要awk中,這裏是你如何做到這一點,

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作爲用於陣列unique和索引具有值從$1所附,所以在輸入文件的每行處理的結束,該陣列看起來像這樣,

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

END子句在處理完所有行後執行,因此從構造的數組中使用split()函數在單個whistespace上分割,我們將數組值的內容存儲到數組temp,並且len包含數字分裂後產生的元素。

爲每個散列索引和每個拆分元素打開一個循環,打印這些值並將其存儲在文件中。

+0

謝謝伊蓮。快速提問:您的_Awk_腳本假定要搜索的文件僅包含每行一個名稱,是否正確?我只是以此爲例,但實際上我有一個7列寬的文件,可以通過_grep_或_awk_進行「排序」。如果我創建一個哈希映射,我將不得不創建一個陣列的散列,每個鍵被分配到一個線,這將是一個數組表示正確的?文件示例:'27 Hatfield Peter London 4 8 Programmer' - Tab是分隔符。 – chrys

+0

提供您的實際輸入的問題。 – Inian

相關問題