2010-04-05 97 views
23

我正在使用cat * .txt將多個txt文件合併爲一個文件,但我需要將每個文件放在一個單獨的行中。Linux:將多個文件合併到一個新行上

合併文件與出現在新行上的每個文件的最佳方式是什麼?

+0

'cat'確實在默認情況下。 – 2010-04-05 05:09:01

+7

@丹尼斯威廉姆森:不,它不。試試'echo -n a> a.txt; echo -n b> b.txt;貓a.txt b.txt'。 – ephemient 2010-04-05 14:25:27

+0

@ephemient:'echo「一些文本」> text.txt;文件text.txt; echo -n「some text」> text.txt; file text.txt' – 2010-04-05 17:07:12

回答

35

只用awk

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

喜歡這個。我調整它以產生一個註釋,這樣我就可以知道新文件的每個部分來自哪個文件:awk'FNR == 1 {printf(「#%s \ n」,ARGV [ARGIND])} 1'謝謝你介紹我來awk。我將.coffee文件合併在一起,這樣我就可以避免咖啡 - 合併,從而獲得可用的源圖。 – Julian 2014-05-30 05:36:32

+1

建議進行以下編輯以避免在結果頂部包含換行符:'awk'FNR == 1 && NR!= 1 {print「」} 1'* .txt' – 2016-06-08 16:20:19

7
for file in *.txt 
do 
    cat "$file" 
    echo 
done > newfile 
17

您可以通過每個文件與迭代for循環:

for filename in *.txt; do 
    # each time through the loop, ${filename} will hold the name 
    # of the next *.txt file. You can then arbitrarily process 
    # each file 
    cat "${filename}" 
    echo 

# You can add redirection after the done (which ends the 
# for loop). Any output within the for loop will be sent to 
# the redirection specified here 
done > output_file 
+1

這會阻塞文件名中有空格的文件。 – 2010-04-05 02:56:35

+0

@IgnacioVazquezAbrams - 謝謝你的提醒(我不會在我的名字中使用空格,所以我通常會忘記這一點)。無論如何,我已經更新了我的示例以正確處理。 – 2010-04-05 03:37:13

+0

我選擇了awk解決方案,但這對其他腳本肯定會有用。謝謝。 – Marco 2010-04-05 04:57:18

6

我假設你想要的文件之間的換行符。

for file in *.txt 
do 
    cat "$file" >> result 
    echo >> result 
done 
23

如果你有一個支持它paste

paste --delimiter=\\n --serial *.txt 

做一個真正偉大的工作

+2

這是文件最快的方法之一連接我曾經測試過。好主意... – retrography 2014-04-29 10:55:23

+0

IMO最佳解決方案。 '-d'和'-s'都是posix指定的,所以不應該有'paste'來支持它們。這個解決方案確實需要更多投票 – kralyk 2014-05-24 13:58:34

+0

+1優秀!太感謝了。確切的問題,我有和完美的答案! – KillBill 2014-10-01 00:51:46

相關問題