2012-05-14 61 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)。