基本信息:我有一个文件“DB_OUTPUT.TXT”,有 304 行,我需要将其转换为 304 个文件(每行一个)。每行包含许多特殊字符,可能长达数万个字符。由于这些原因,我很难使用 cmd.exe 批处理文件(它限制了输入量)和 echo 命令(它会尝试执行每个特殊字符,除非我必须将它们全部转义)。
我还有一个文件“DB_OUTPUT_FILENAMES.TXT”,其中包含“db_output.txt”中即将成为文件的每一行的不同文件名。因此,DB_OUTPUT.TXT 的第 1 行需要成为新文件的主体,其名称等于 DB_OUTPUT_FILENAMES.TXT 的第 1 行。
额外信息:您可能已经猜到了,DB_OUTPUT.TXT 是数据库的输出;它包含 304 条记录,每条记录有 6 或 7 列,宽度固定,最后一列是 SQL 查询。这些行(数据库记录)中的每一行都将用作创建新数据库对象的脚本,这就是需要保留特殊字符的原因。
问题:有没有办法以批处理方式执行此操作? 我对 Windows 解决方案或 Linux 解决方案都很满意。
答案1
split
应该可以工作(刚刚在二进制文件比你描述的还要糟糕):
split -l 1 DB_OUTPUT.txt
这将创建一堆以“x”开头的文件。要批量重命名它们,请先使用
ls x* > oldnames
再次检查行数是否一致:
wc -l oldnames DB_OUTPUT_FILENAMES.TXT
如果你的文件名列表长度合适,这应该会给出两倍相同的行数。最后,
( paste oldnames DB_OUTPUT_FILENAMES.TXT ) | while read i; do mv $i; done
(请注意,这假设输出文件名不包含空格。)
答案2
以下是一个 shell 脚本:
#!/bin/sh
test "$#" -ne 3 && { echo arguments: datafile namefile dstdir ; exit 1 ; }
data="$1"
names="$2"
dstdir="$3"
test -e "$dstdir" || mkdir "$dstdir"
while read fn ; do
read -r lin <&3
echo -n "$lin" >"$dstdir/$fn"
done <"$names" 3<"$data"
您可以在类 Unix 环境(如 Linux、Mac OS X 或 Windows 下的 Cygwin)中运行该脚本。例如,将脚本存储到文件中splittofiles
。执行chmod a+x splittofiles
。
运行它:splittofiles DB_OUTPUT.TXT DB_OUTPUT_FILENAMES.TXT output
。结果文件将会被创建在目录中output
。
脚本需要进一步完善,增加更多错误检查条件。注释中提到的 Python 程序可能比这个脚本更快。