2012-05-24 70 views
10

我想用bash將文件列表(超過1K)的內容合併到一個大文件中。shell - cat - 將文件內容合併到一個大文件

我已經試過以下cat命令:

cat * >> bigfile.txt 

但是什麼這個命令的作用是合併的一切,也包括的東西已經合併。

例如 FILE1.TXT

content1 

FILE2.TXT

content2 

file3.txt

content3 

file4.txt

content4 

bigfile.txt

content1 
content2 
content3 
content2 
content3 
content4 
content2 

但我想只是

​​

.txt文件

內的另一個方法是先cat file1.txt file2.txt ...等等...但我不能超過1K文件的詳細做到這一點!

感謝您的支持!

回答

18

問題是你把bigfile放在同一個目錄下,因此使它成爲*的一部分。因此,像

cat dir/* > bigfile 
如你想的那樣,

應該只是工作與位於您的fileN.txt文件dir/

+1

...或者'貓*>/tmp/bigfile; mv/tmp/bigfile .'。 – tripleee

+0

我認爲fabioln是故意在輸入中包含'bigfile.txt';他希望從各種'file * .txt'中添加到文件中,但同時刪除重複項。 – chepner

+0

謝謝你們。是的,那是問題所在!我把bigfile放在同一個目錄中...所以我使用了你給我的命令(cat dir/*> bigfile)!只是另一個問題:爲什麼你只是>而不是>>是否一樣?謝謝! – fabioln79

-3

嘗試:

cat `ls -1 *` >> bigfile.txt 

我沒有UNIX機器方便的時刻先爲你測試它。

+2

-1這不能解決任何問題,並且會引入一些新的問題。當通配符已經擴展到你想要的文件時,不要使用'ls'!不要使用未加引號的文件名(反引號的輸出),因爲如果文件名包含空格,它將會中斷。 – tripleee

+0

我寫的時候實際上是在想一個循環,但它並沒有正確地出現在我的頭上。無論如何,我更喜歡Barton的回答。 – JerseyMike

4

在重新閱讀您的問題時,您似乎希望將數據附加到bigfile.txt,但是 未添加重複項。你必須通過sort -u通過一切都過濾掉重複:

sort -u * -o bigfile.txt 

-o選項進行排序,您可以放心地包括輸入bigfile.txt內容排序文件與輸出覆蓋之前。

編輯:假設bigfile.txt進行排序,你可以嘗試一個兩階段的過程:

sort -u file*.txt | sort -um - bigfile.txt -o bigfile.txt 

首先我們輸入文件進行排序,刪除重複。我們將該輸出傳送到另一個sort -u進程,這一個使用-m選項,它告訴sort合併兩個先前排序的文件。我們將合併的兩個文件是-(標準輸入,來自第一個sort的流)和bigfile.txt本身。我們再次使用-o選項來允許我們在輸入後將輸出寫回bigfile.txt

+0

我已經修改了答案,允許將新數據合併到'bigfile.txt'中,使其保持排序而沒有重複的引入。我認爲如果不切換到更加結構化的格式(如數據庫),這是最好的。 – chepner

4

你也可以在同一個目錄下的輸出文件,你就必須要更復雜一點比*

shopt -s extglob 
cat !(bigfile.txt) > bigfile.txt 
+0

謝謝。我有一個與這個命令相關的問題:包含文件的目錄大小爲557GB,但創建的大文件大小爲495.我不知道如何解釋這個問題。我做錯了什麼?謝謝! – fabioln79

+0

@ fabioln79提供的信息量很大,懷疑這可能是由於實際使用的空間與塊大小有關(請閱讀後者) – user66001

2

另一種方法是貓FILE1.TXT FILE2.TXT ..等等......但我不能爲超過1k的文件做到這一點!

這就是xargs的是:

find . -maxdepth 1 -type f -name "file*.txt" -print0 | xargs -0 cat > bigfile.txt 
+0

xargs是否執行* each *參數的命令?如果是這樣,你應該使用'>>'而不是'>'嗎?我在想,完成後,bigfile.txt將只包含傳遞給它的最後一個文件的內容。 – JerseyMike

+1

xargs爲所有參數運行一次命令,您不需要使用''>>''。 –

+0

謝謝你的澄清。手冊頁對我來說不是很清楚。 – JerseyMike

1

這是一個老問題,但我仍然會給與xargs

  1. 名單另一種方法要Concat的

    文件

    ls | grep的[模式]>文件清單

  2. 審查你的文件在與vicat正確的順序。如果您使用的後綴(1,2,3,...,N),這應該是沒有問題的

  3. 創建最終文件

    貓文件清單| xargs的貓>> [最後文件]

  4. 刪除文件列表

    RM -f文件清單

希望這有助於任何人

相關問題