我收到了一个文本文件file.txt
(12 MB),其中包含:
something1
something2
something3
something4
(...)
有没有办法将file.txt
拆分为12 * .txt文件,请说file2.txt
,file3.txt
,file4.txt
(...)?
答案 0 :(得分:54)
$ split -l 100 input_file output_file
其中-l
是每个文件中的行数。这将创建:
答案 1 :(得分:45)
您可以使用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
,{{1 },r/N
。
答案 2 :(得分:12)
John的答案不会像OP那样产生.txt文件。使用:
split -b=1M -d file.txt file --additional-suffix=.txt
答案 3 :(得分:1)
使用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
不同,这个确保行数最均匀。
答案 4 :(得分:1)
不管上面说的是什么,在我的ubuntu 16上我必须这样做:
> split -b 10M -d system.log system_split.log
请注意-b和值
之间的空格
答案 5 :(得分:0)
尝试这样的事情:
awk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt
for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;
答案 6 :(得分:0)
我同意@CS Pei,但这并不适合我:
split -b=1M -d file.txt file
... =
之后-b
将其抛弃。相反,我只是删除它并在它和变量之间没有留下空格,并使用小写&#34; m&#34;:
split -b1m -d file.txt file
要附加&#34; .txt&#34;,我们使用@schoon所说的内容:
split -b=1m -d file.txt file --additional-suffix=.txt
我有一个188.5MB的txt文件,我使用了这个命令[但-b5m
用于5.2MB文件],它返回了35个拆分文件,所有文件都是txt文件,5.2MB除了最后一个5.0文件MB。现在,既然我希望我的线条保持整体,我想每100万行拆分主文件,但split
命令不允许我甚至做-100000
更不用说#&# 34; -1000000
,因此要分割的大量行将无效。
答案 7 :(得分:0)
在我的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
答案 8 :(得分:0)
如果每个零件都有相同的行号,例如22,这是我的解决方案:
split --numeric-suffixes=2 --additional-suffix=.txt -l 22 file.txt file
然后您获得前22行的 file2.txt ,下22行的 file3.txt ...
感谢@ hamruta-takawale,@ dror-s和@ stackoverflowuser2010