我有一个包含以下内容的文件:
# new file
text in file 1
# new file
text in file 2
# new file
text in file 3
这里的模式是# new file
。
我没有将每个文件保存到 xx00、xx01 和 xx02,而是保存到特定文件:another file
、file new
、last one
。
这3个文件存在于当前目录中,所以我想将它们作为数组提供,覆盖它们:
csplit -z infile '/# new file/' "${array[*]}"
可以直接提供数组
array=('another file' 'file new' 'last one')
echo ${array[*]}
another file file new last one
或者列出当前目录
array=($(find . -type f))
echo ${array[*]}
./another file ./file new ./last one
对此脚本的修改可能是解决方案:
awk -v file="1" -v occur="2" '
{
print > (file".txt")
}
/^\$\$\$\$$/{
count++
if(count%occur==0){
if(file){
close(file".txt")
++file
}
}
}
' Input_file
我仍然会考虑使用
csplit
,但随后重命名生成的文件。用法
即使在文本文件和文件名中包含空格和非 ascii 字符,也可以使用此方法,而无需使用临时文件:
infile
:必须为 awk 命令提供文件名作为单独的参数,并使用单引号,这样 shell 就不会展开(双引号),在此
split.sh
脚本中:控制台看起来像这样:
如果参数作为另一个命令的输出传递(文件必须先前存在于文件系统中):
它用空格分割参数:
为了解决这个问题,将参数作为数组传递给 awk,用换行符而不是空格分隔,使用以下
split.sh
脚本:现在结果是:
要写入的文件数量必须至少与将执行的拆分数量相同。如果多了,其余的将被忽略。