如何将一个文件分割成相等的部分,而不打破个别行?

我想知道是否有可能将一个文件分成相等的部分(编辑: = 除了最后一个之外的所有部分都相等) ,而不破坏行?使用 Unix 中的 split 命令,行可能会被分成两半。有没有一种方法,比如说,把一个文件分成5等份,但仍然只包含整行(如果其中一个文件大一点或小一点,这没有问题) ?我知道我可以只计算行数,但是我必须为 bash 脚本中的许多文件这样做。非常感谢!

159371 次浏览

如果你的意思是一个相同数量的 台词, split有一个这样的选项:

split --lines=75

如果你需要知道 N相等部分的 75应该是什么,它是:

lines_per_part = int(total_lines + N - 1) / N

where total lines can be obtained with wc -l.

有关示例,请参见下面的脚本:

#!/usr/bin/bash


# Configuration stuff


fspec=qq.c
num_files=6


# Work out lines per file.


total_lines=$(wc -l <${fspec})
((lines_per_file = (total_lines + num_files - 1) / num_files))


# Split the actual file, maintaining lines.


split --lines=${lines_per_file} ${fspec} xyzzy.


# Debug information


echo "Total lines     = ${total_lines}"
echo "Lines  per file = ${lines_per_file}"
wc -l xyzzy.*

This outputs:

Total lines     = 70
Lines  per file = 12
12 xyzzy.aa
12 xyzzy.ab
12 xyzzy.ac
12 xyzzy.ad
12 xyzzy.ae
10 xyzzy.af
70 total

最新版本的 split允许您使用 -n/--number选项指定多个 CHUNKS。因此,您可以使用类似于:

split --number=l/6 ${fspec} xyzzy.

(这是 ell-slash-six,意思是 lines,不是 one-slash-six)。

这将给您提供大致相同的文件大小,没有中间行拆分。

我之所以提到最后一点,是因为它没有给出每个文件中大致相同数量的 台词,而是给出了相同数量的 角色。

因此,如果您有一个20个字符的行和19个1个字符的行(总共20行) ,并分割为5个文件,那么很可能 不会在每个文件中都有4行。

该脚本甚至不是必要的,split(1)支持开箱即用的功能:
split -l 75 auth.log auth.log. 上面的命令将文件分割成75行的块,并以 auth.log.aa, auth.log.ab, ...的形式输出文件

原始文件上的 wc -l和输出结果如下:

  321 auth.log
75 auth.log.aa
75 auth.log.ab
75 auth.log.ac
75 auth.log.ad
21 auth.log.ae
642 total

Split 在 Coreutils 版本8.8(2010年12月22日发布)中使用—— number 选项更新,以生成特定数量的文件。选项—— number = l/n 在不拆分行的情况下生成 n 个文件。

Coreutils 手册

var dict = File.ReadLines("test.txt")
.Where(line => !string.IsNullOrWhitespace(line))
.Select(line => line.Split(new char[] { '=' }, 2, 0))
.ToDictionary(parts => parts[0], parts => parts[1]);




or


enter code here


line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);


ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in"

我编写了一个 bash 脚本,它给出了一些部分作为输入,并分割了一个文件

#!/bin/sh


parts_total="$2";
input="$1";


parts=$((parts_total))
for i in $(seq 0 $((parts_total-2))); do
lines=$(wc -l "$input" | cut -f 1 -d" ")
#n is rounded, 1.3 to 2, 1.6 to 2, 1 to 1
n=$(awk  -v lines=$lines -v parts=$parts 'BEGIN {
n = lines/parts;
rounded = sprintf("%.0f", n);
if(n>rounded){
print rounded + 1;
}else{
print rounded;
}
}');
head -$n "$input" > split${i}
tail -$((lines-n)) "$input" > .tmp${i}
input=".tmp${i}"
parts=$((parts-1));
done
mv .tmp$((parts_total-2)) split$((parts_total-1))
rm .tmp*

我使用了 headtail命令,并将其存储在 tmp 文件中,以便分割文件

#10 means 10 parts
sh mysplitXparts.sh input_file 10

或者用 awk,其中0.1是10% = > 10个部分,或者0.334是3个部分

awk -v size=$(wc -l < input) -v perc=0.1 '{
nfile = int(NR/(size*perc));
if(nfile >= 1/perc){
nfile--;
}
print > "split_"nfile
}' input

一个简单问题的简单解答:

split -n l/5 your_file.txt

no need for scripting here.

伙计文件,CHUNKS may be:

l/N     split into N files without splitting lines

更新

并非所有 UNIX dist 都包含此标志。例如,它不会在 OSX 中工作。要使用它,可以考虑 用 GNU核心工具组代替 Mac OS x 实用程序