我拥有一个文本文件 file.txt
(12 MB),其中包含:
something1
something2
something3
something4
(...)
有没有办法将file.txt
文件分成12个*.txt文件,比如file2.txt
、file3.txt
、file4.txt
等?
您可以使用 Linux Bash 核心实用程序 split
:
split -b 1M -d file.txt file
注意,M
或MB
都可以,但大小不同。MB是1000 * 1000,M是1024^2。
如果您想按行分隔,可以使用-l
参数。
更新a=(`wc -l yourfile`) ; lines=`echo $(($a/12)) | bc -l` ; split -l $lines -d file.txt file
另一种解决方法是由Kirill提出的,您可以尝试以下内容:
split -n l/12 file.txt
注意这里是使用 l
而非 one
,split -n
有几个选项可以使用,例如 N
、k/N
、l/k/N
、r/N
、r/k/N
。
split
而不拆分行来确保文件数量是偶数的方法? - konsoleboxwc -l
命令获取文件总行数,然后运行以下命令来将文件拆分成多个小文件:a=(
wc -l 你的文件) ; lines=
echo $a/12 | bc -l ; split -l=$lines -d 你的文件.txt 文件
。 - CS Peisplit
可以做到这一点并不正确。而且正如预期的那样,你使用了wc
。 - konsoleboxa=(\
wc -c yourfile`) ; n=12; bytes=`echo (a-a%n)/n` | bc -l` ; split -b=$bytes -d file.txt file`,如果您不使用可被整除的数字,则最后一个文件将包含剩余的字节。您的方法的派生似乎非常容易调整! - That Realty Programmer Guy$ split -l 100 input_file output_file
-l
是每个文件中行数的数量。这将创建:
wc -l <文件名>
。 - A. K.CS Pei的回答不能像原帖要求一样生成.txt文件。请使用以下代码:
split -b=1M -d file.txt file --additional-suffix=.txt
使用 Bash:
readarray -t lines < file.txt
count=${#lines[@]}
for i in "${!lines[@]}"; do
index=$(( (i * 12 - 1) / count + 1 ))
echo "${lines[i]}" >> "file${index}.txt"
done
使用 AWK:
awk '{
a[NR] = $0
}
END {
for (i = 1; i in a; ++i) {
x = (i * 12 - 1) / NR + 1
sub(/\..*$/, "", x)
print a[i] > "file" x ".txt"
}
}' file.txt
split
不同,这个函数确保行数最为均匀。split
也可以做到这个。 - CS Peiwc -l
进行计算,否则我们就可以直接使用 bash 或 awk 了。这也是我编写脚本而不考虑 split 的原因。 - konsolebox不管之前的回答说了什么,在我的Ubuntu 16.04(Xenial Xerus)上,我必须执行以下操作:
split -b 10M -d system.log system_split.log
-b
和值之间的空格。additional-suffix
选项,这会创建system_split.log1
、system_split.log2
等文件吗? - Damien Roche# extract just the **first** 100000 lines of /var/log/syslog into
# ~/syslog_sample.txt
head -n 100000 /var/log/syslog > ~/syslog_sample.txt
# extract just the **last** 100000 lines of /var/log/syslog into
# ~/syslog_sample.txt
tail -n 100000 /var/log/syslog > ~/syslog_sample.txt
split
命令没有-n
或--additional-suffix
的命令行选项。
相反,我使用了这个:
split -d -l NUM_LINES really_big_file.txt split_files.txt.
-d
是为 split_files.txt.
文件名添加数字后缀,-l
指定每个文件的行数。
例如,假设我有这样一个非常大的文件:
$ ls -laF
total 1391952
drwxr-xr-x 2 user.name group 40 Sep 14 15:43 ./
drwxr-xr-x 3 user.name group 4096 Sep 14 15:39 ../
-rw-r--r-- 1 user.name group 1425352817 Sep 14 14:01 really_big_file.txt
这个文件有100,000行,我想把它分成最多30,000行的文件。这个命令将运行拆分并在输出文件模式split_files.txt.
的末尾附加一个整数。
$ split -d -l 30000 really_big_file.txt split_files.txt.
生成的文件按照每个文件最多30,000行正确拆分。
$ ls -laF
total 2783904
drwxr-xr-x 2 user.name group 156 Sep 14 15:43 ./
drwxr-xr-x 3 user.name group 4096 Sep 14 15:39 ../
-rw-r--r-- 1 user.name group 1425352817 Sep 14 14:01 really_big_file.txt
-rw-r--r-- 1 user.name group 428604626 Sep 14 15:43 split_files.txt.00
-rw-r--r-- 1 user.name group 427152423 Sep 14 15:43 split_files.txt.01
-rw-r--r-- 1 user.name group 427141443 Sep 14 15:43 split_files.txt.02
-rw-r--r-- 1 user.name group 142454325 Sep 14 15:43 split_files.txt.03
$ wc -l *.txt*
100000 really_big_file.txt
30000 split_files.txt.00
30000 split_files.txt.01
30000 split_files.txt.02
10000 split_files.txt.03
200000 total
split --numeric-suffixes=2 --additional-suffix=.txt -l 22 file.txt file
你可以获得 file2.txt 的前22行,file3.txt 的接下来的22行,以此类推。
感谢 @hamruta-takawale、@dror-s 和 @stackoverflowuser2010。
我同意@CS Pei的观点,但这对我没有用:
split -b=1M -d file.txt file
...因为-b
后面的=
使它失效了。相反,我只是删除了它,并且在变量和它之间没有留下空格,并使用小写字母"m":
split -b1m -d file.txt file
要附加“.txt”,我们使用@schoon所说的:
split -b=1m -d file.txt file --additional-suffix=.txt
我有一个188.5MB的txt文件,我使用了这个命令[但是用-b5m
来分成5.2MB的文件],它返回了35个分割文件,所有这些文件都是txt文件,大小都是5.2MB,除了最后一个文件是5.0MB。现在,由于我希望我的行保持完整,我想将主文件每100万行拆分一次,但是split
命令甚至不允许我做-100000
,更不用说"-1000000
"了,因此无法拆分大量行。
split
命令的-C
选项。 - Amit Naiduawk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt
for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;