【问题标题】:Splitting bulk text file every n line每 n 行拆分批量文本文件
【发布时间】:2016-01-31 08:58:10
【问题描述】:

我有一个包含多个文本文件的文件夹。我正在尝试将所有文​​本文件拆分为每个文件 10000 行,同时保留基本文件名 i.e. if filename1.txt contains 20000 lines the output will be filename1-1.txt (10000 lines) and filename1-2.txt (10000 lines).

我尝试使用split -10000 filename1.txt,但这没有保留基本文件名,我必须对文件夹中的每个文本文件重复该命令。我也尝试过for f in *.txt; do split -10000 $f.txt; done。这也没有用。

知道我该怎么做吗?谢谢。

【问题讨论】:

  • 您可以使用split 然后rename 来更改拆分输出的文件名吗?

标签: linux shell unix awk cygwin


【解决方案1】:
for f in filename*.txt; do split -d -a1 -l10000 --additional-suffix=.txt "$f" "${f%.txt}-"; done

或者,写成多行:

for f in filename*.txt
do
    split -d -a1 -l10000 --additional-suffix=.txt "$f" "${f%.txt}-"
done

它是如何工作的:

  • -d 告诉split 使用数字后缀

  • -a1 告诉split 仅以单个数字作为后缀。

  • -l10000 告诉split 每 10,000 行拆分一次。

  • --additional-suffix=.txt 告诉split.txt 添加到新文件名称的末尾。

  • "$f" 告诉split 要拆分的文件的名称。

  • "${f%.txt}-" 告诉split 用于拆分文件的前缀名称。

示例

假设我们从这些文件开始:

$ ls
filename1.txt  filename2.txt

然后我们运行我们的命令:

$ for f in filename*.txt; do split -d -a1 -l10000 --additional-suffix=.txt "$f" "${f%.txt}-"; done

完成后,我们现在有了原始文件和新的拆分文件:

$ ls
filename1-0.txt  filename1-1.txt  filename1.txt  filename2-0.txt  filename2-1.txt  filename2.txt

使用较旧的、功能较少的 split 形式

如果您的拆分不提供--additional-suffix,请考虑:

for f in filename*.txt
do 
    split -d -a1 -l10000 "$f" "${f%.txt}-"
    for g in "${f%.txt}-"*
    do 
        mv "$g" "$g.txt"
    done
done

【讨论】:

  • 嗯,我的man splitsplit --help 都没有显示任何关于选项--additional-suffix 的信息。你用什么版本? (我的是 8.13)
  • 我在 linux 上,split 是 GNU coreutils 8.23 的一部分。
  • 谢谢。在 Ubuntu 12.04 上,这还不可用。在 14.04 上,我们有 8.21 版本,它已经有了这个选项。 OP 应该考虑这一点,以防他的脚本需要可移植。
  • @Alfe 好的。我添加了一个不需要--additional-suffix的版本。
【解决方案2】:

不需要 shell 循环,只需一个简单的 awk 命令即可处理所有文件:

awk 'FNR%1000==1{if(FNR==1)c=0; close(out); out=FILENAME; sub(/.txt/,"-"++c".txt)} {print > out}' *

【讨论】:

    【解决方案3】:
    --suffix-length=3  
    

    如果要制作超过 9 个文件,您可能需要添加类似的内容。

    【讨论】: