2014-10-06 29 views
-1

我正在bash(Fedora)中工作。 我的文本文件列表如下:使用循環合併文件列表(bash)

filenameA filename1 
filenameA filename2 
filenameA filename3 
filenameB filename4 
filenameB filename5 

我要合併(貓)都在第二列與他們的比賽在第一列這樣列出的文件:

cat filenameA filename1 filename2 filename3 > newfilenameA 
cat filenameB filename4 filename5 > newfilenameB 

是否有'while'或'for'循環可以完成這個更長的文件列表? 我想將文件內容合併起來,而不僅僅是文件名列表。

回答

3

我建議你使用AWK:

awk '{a[$1]=a[$1] OFS $2}END{for(i in a)system("cat " i OFS a[i] " >new" i)}' file 

第一塊團體基於第二列的值的條目。輸入項由OFS分隔,輸出字段分隔符默認爲空格。

END塊,一旦所有的文件中的行都已被處理,循環經過的a每個元素,使用system運行在殼cat。在awk中,字符串默認是串聯的,因此可以通過將數組鍵i和值a[i]連接在一起來構建命令字符串。 cat的輸出被重定向到一個文件,其名稱是通過在輸入文件名前加上「new」來獲得的。

+0

我還不清楚。期望的輸出。我希望將文件內容進行組合。上面的解決方案給我一個新的文件「文件名」,但不是文件內容。謝謝! – Trevor 2014-10-06 16:29:15

+0

編輯中的代碼給了我 - awk cmd語法錯誤 - 最終報價處的「未終止的字符串」。我認爲它缺少一個報價。 – Trevor 2014-10-06 16:56:20

+0

它運行完美,除了我必須按ctrl-c來結束掛斷。 – Trevor 2014-10-06 17:25:54