2011-11-18 72 views
66

我有多個文件,我想要連接cat。 假設連接文件並在文件之間插入新行

File1.txt 
foo 

File2.txt 
bar 

File3.txt 
qux 

我想Concat的,這樣最終的文件看起來像:

foo 

bar 

qux 
與往常一樣 cat File*.txt > finalfile.txt

foo 
bar 
qux 

什麼是應該做的正確方法

相反的呢?

+2

可能重複th「cat」?](http://stackoverflow.com/questions/1653063/how-do-i-include-a-blank-line-between-files-im-concatenating-with-cat) – legoscia

回答

63

你可以這樣做:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done 

確保文件finalfile.txt你運行上面的命令之前不存在。

如果你被允許使用awk你可以這樣做:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt 
+3

'AWK'{打印$ 0}'* .txt' – timger

+3

by'AWK'你的意思是'awk',對嗎? –

+5

這有一個明顯的缺陷,即最終(從第一個備選方案)或開始(第二個備選方案)將會出現空行。不過,你可以用'awk'FNR == 1 && NR> 1 ...''來輕鬆防範。 – tripleee

21

如果是我做這件事我會使用SED:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt 

在這個sed的模式$有兩層含義,首先它僅匹配最後一行數(作爲應用模式的行的範圍),其次它匹配替換模式中行的末尾。

如果你的sed的版本沒有-s(過程輸入單獨文件),你可以做到這一切作爲一個循環,但:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt 
+2

或者在GNU sed中:'sed -s'$ G'* .txt> finalfile.txt' –

+0

只有一個流!這應該是被接受的答案! –

24

如果你有足夠少的文件,您可以列出每一個,那麼您可以在猛砸使用process substitution,每對文件之間插入新行:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt 
+0

美麗!謝謝。 –

6

那怎麼我只是做了它在OSX 10.10.3

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done 

因爲沒有參數的簡單'echo'命令最後沒有插入新行。

4

這適用於擊:

for f in *.txt; do cat $f; echo; done 

相反的答案與>>(附加),此命令的輸出可以被管道輸送到其他程序。

實例:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt(括號是可選的)
  • for ... done | less(管道成更小)
  • for ... done | head -n -1(這剝掉後空白行)
3

在python中,它與之間的空行連接文件(,禁止顯示增加一個額外的後空白行):

print '\n'.join(open(f).read() for f in filenames), 

這裏是難看蟒單行可以從外殼被調用和輸出打印到文件中:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt 
3

你可以這樣做使用xargs它,如果你喜歡,但主要的想法仍然是相同的:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt 
的[我怎樣包括我串聯無線文件之間的空行
+0

謝謝。我發現'xargs'比bash中的循環更容易使用。 – RawwrBag

相關問題