2012-05-14 93 views
0

我不知道我在做什麼錯在以下情況 - 我想合併多個文件到一個,但我想合併它們中的很多,所以我想使用類似的東西這樣的:Cat命令不合並腳本中的文件

*input file* that contains lines 
file1.txt >> mergedfiles1.txt 
file2.txt >> mergedfiles1.txt 
file3.txt >> mergedfiles2.txt 
file4.txt >> mergedfiles2.txt 
... 

如果我嘗試使用簡單的腳本,因爲我通常做

cat *input file* | while read i 
do 
cat $i 
done 

它實際上並沒有合併的文件,但寫到

*content* of file1.txt 
cat: >> : file does not exist 
cat: mergedfiles1.txt : file does not exist 

我試圖在輸入文件的每一行的開始位置放置指令貓,但它不起作用。

我想這是一個簡單的錯誤,但我無法找到解決方案。

感謝您的幫助。

回答

1

您可以使用cat這樣合併三個文件:

cat file1 file2 filet3 > merged_files 
0

你需要使用像這樣

cat input_file > output file 
+0

單個'>'將覆蓋而不是合併。 – StepTNT

0

這是因爲bash中把一個空的空間作爲行分隔符。

所以你必須管理這件事。

實際上,你可以刪除你的輸入文件>>,做這樣的事情:

k=0 
for line in $(cat inputFile); do 
    if [ $k -eq 0 ]; then 
     src=$line 
    let k=$k+1 
    else 
    cat $src>>$line 
    k=0 
    fi 
done 

它已經從我上次bash腳本一段時間,但邏輯非常簡單。

由於bash使用空格和行分隔符,所以您必須保留一個計數器來確定該行是否真的結束。 所以我們使用k。 擁有k = 0意味着我們處於行的前半部分,因此我們需要將文件名存儲到var(src)中。

k爲1時,表示我們處於行的最後一半,所以我們可以實際執行cat命令。

如果你的文字就像是我的代碼將工作:

file1.txt mergedfiles1.txt 
file2.txt mergedfiles1.txt 
file3.txt mergedfiles2.txt 
file4.txt mergedfiles2.txt 
0

我不太清楚你想做的事,但認爲這個例子可能有所幫助:

#!/bin/bash 

SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 

for file in * 
do 
    echo "$file" 
done 

IFS=$SAVEIFS 

IFS的操作是這樣,你可以拿起和處理空間分隔的文件s,這些比Windows常見的報告更常見 - 至少從我的經驗來看 - Linux(Unix)。