每n行拆分批量文本文件

时间:2015-10-30 20:24:55

标签: linux shell unix awk cygwin

我有一个包含多个文本文件的文件夹。我正在尝试将所有文​​本文件拆分为每个文件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。这也行不通。

知道我该怎么办?谢谢。

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:1)

不需要shell循环,只需要一个简单的awk命令对所有文件执行:

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