如何将一个文本文件拆分为多个 *.txt 文件?
- 2024-10-31 08:38:00
- admin 原创
- 46
问题描述:
我得到一个文本文件file.txt
(12 MB),其中包含:
something1
something2
something3
something4
(...)
有没有办法将其分割成 12个file.txt
*.txt 文件,比如说file2.txt
,,,等等?file3.txt
`file4.txt`
解决方案 1:
您可以使用 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/Nr/N
r/k/N`
解决方案 2:
$ split -l 100 input_file output_file
其中-l
是每个文件中的行数。这将创建:
输出文件aa
输出文件ab
输出文件ac
输出文件
....
解决方案 3:
CS Pei 的答案不会像 OP 想要的那样生成 .txt 文件。使用:
split -b=1M -d file.txt file --additional-suffix=.txt
解决方案 4:
使用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
,这个可以确保行数最均匀。
解决方案 5:
无论之前的答案是什么,在我的Ubuntu 16.04(Xenial Xerus)上我必须这样做:
split -b 10M -d system.log system_split.log
请注意和值之间的空格。-b
解决方案 6:
我搜索了如何做到这一点,然后来到了这里,因此我也在这里发布了这篇文章供其他人参考:
获取文件的所有内容,这是正确的答案!但是,split
对于那些只想提取文件的一部分作为文件样本的人来说,使用或:head
`tail`
# 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
解决方案 7:
我同意@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 个拆分文件,除最后一个文件为 5.0MB 外,其余均为 txt 文件,大小均为 5.2MB。现在,由于我希望我的行保持完整,我想每 100 万行拆分一次主文件,但该split
命令甚至不允许我这样做,-100000
更不用说 " 了-1000000
,因此拆分大量行将无法工作。
解决方案 8:
尝试这样的操作:
awk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt
for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;
解决方案 9:
在我的 Linux 系统(Red Hat Enterprise 6.9)上,该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
解决方案 10:
如果每个部分的行数相同,例如 22,那么我的解决方案如下:
split --numeric-suffixes=2 --additional-suffix=.txt -l 22 file.txt file
这样您将获得包含前 22 行的file2.txt 、包含接下来 22 行的file3.txt ,等等。
感谢@hamruta-takawale、@dror-s 和@stackoverflowuser2010
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件