连接文本文件内容和/或向所有人添加中断

时间:2012-01-20 18:59:42

标签: append centos concatenation text-files

我有一堆.txt文件需要制作成一个大文件,可以被Microsoft Excel等程序读取。

问题是文件最后没有中断,因此它们最终排成一行。

以下是我所拥有的一个例子(数字代表行号):

1. | first line of txt file
2. | second line

以下是我想将其转化为:

1. | first line of txt file
2. | second line
3. | 

我在文件夹中有大约3000个这些文件,所有文件都采用相同的格式。有没有办法获取这些文件并在它们的末尾添加一个空行?我想这样做而不需要复杂的代码,即PHP等。我知道你可以使用终端做类似的事情(我在CentOS上),但是如果有什么特别需要的东西,我会'我错过了。

2 个答案:

答案 0 :(得分:4)

实现这一目标的最简单方法是使用bash for-loop:

for file in *.txt; do
    echo >> "$file"
done

这会迭代当前目录中的所有.txt个文件,并为每个文件追加换行符。它可以写成一行,您只需要在;之前添加done

请注意引用$file来处理名称中包含空格和其他有趣字符的文件。

如果文件分布在多个目录中而不是全部在同一个目录中,则可以将*.txt替换为**/*.txt以迭代当前文件夹的所有子目录中的所有.txt个文件


另一种方法是使用sed

sed -i "$ s:$:\n:" *.txt

-i标志告诉sed就地编辑文件。 $匹配最后一行,然后s命令用新行($)替换行尾(再次\n),从而附加一行文件的结尾。

答案 1 :(得分:2)

试试这个代码段:

for f in *; do ((cat $f && echo "") > $f.tmp) done && rename -f 's/\.tmp$//' *.tmp
  • 这基本上会占用文件夹(for f in *; do)中的任何文件。
  • 在STDOUT(cat $f)上输出文件,然后输出换行符(echo ""
  • 并将输出重定向到filename.tmp(> $f.tmp
  • 然后将*.tmp个文件移动到原始文件(rename -f 's/\.tmp$//' *.tmp)。

修改 甚至更简单:

for f in *; do (echo "" >> $f) done
  • 这基本上会占用文件夹(for f in *; do)中的任何文件。
  • 输出换行符(echo ""
  • 并将其附加到文件(>> $f