0

我不确定在以下情况下我做错了什么 - 我想将多个文件合并为一个,但我想合并很多文件,所以我想使用这样的东西:

*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

我试图将命令 cat 放在输入文件的每一行的开头,但效果不佳。

我想这是一个简单的错误,但我无法找到解决方案。

感谢帮助。

4

4 回答 4

1

您可以通过这种方式使用 cat 合并您的三个文件:

cat file1 file2 filet3 > merged_files
于 2012-05-14T11:43:54.520 回答
0

你需要像这样使用它

cat input_file > output file
于 2012-05-14T11:35:23.483 回答
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
于 2012-05-14T11:40:23.040 回答
0

我不太确定你想做什么,但认为这个例子可能会有所帮助:

#!/bin/bash

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

for file in *
do
    echo "$file"
done

IFS=$SAVEIFS

IFS 的操作是为了让您可以拾取和处理空间分隔的文件,这些文件在 Windows 报告中比 - 至少根据我的经验 - Linux (Unix) 更常见。

于 2012-05-14T17:04:16.193 回答