如何将一个文本文件拆分成多个* .txt文件?

时间:2013-09-26 14:34:36

标签: linux bash

我收到了一个文本文件file.txt(12 MB),其中包含:

something1
something2
something3
something4
(...)

有没有办法将file.txt拆分为12 * .txt文件,请说file2.txtfile3.txtfile4.txt(...)?

9 个答案:

答案 0 :(得分:54)

$ split -l 100 input_file output_file

其中-l是每个文件中的行数。这将创建:

  • output_fileaa
  • output_fileab
  • output_fileac
  • output_filead
  • ....

答案 1 :(得分:45)

您可以使用linux bash核心实用程序split

split -b 1M -d  file.txt file 

请注意,MMB都可以,但尺寸不同。 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不是onesplit -n有几个选项,例如Nk/Nl/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