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

Linux 如何将一个文本文件拆分为多个*.txt文件?,linux,bash,Linux,Bash,我得到了一个文本文件file.txt(12Mbs),其中包含: 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 如果要按行

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

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
根据建议的另一种解决方案,您可以执行以下操作

split -n l/12 file.txt
注意,
l
不是
one
split-n
有几个选项,比如
n
k/n
l/k/n
r/n
r/k/n

使用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
split
不同,此选项确保行数最为均匀

$ split -l 100 input_file output_file
其中
-l
是每个文件中的行数。这将产生:

  • 输出文件aa
  • 输出文件
  • 输出文件
  • 输出文件

    • 约翰的答案不会产生OP想要的.txt文件。使用:

      split -b=1M -d  file.txt file --additional-suffix=.txt
      

      不管上面怎么说,在我的ubuntu 16上,我必须做:

      > split -b 10M -d  system.log system_split.log 
      
      请注意-b和值之间的空格


      试着这样做:

      awk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt
      
      for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;
      
      $ 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
      

      我同意@CS Pei,但这对我不起作用:

      split-b=1M-d file.txt文件

      …因为
      =
      之后的
      -b
      将其丢弃。相反,我只是简单地删除了它,在它和变量之间没有留下任何空间,并使用小写字母“m”:

      split-b1m-d file.txt文件

      为了附加“.txt”,我们使用@schoon所说的:

      split-b=1m-d file.txt文件--附加后缀=.txt

      我有一个188.5MB的txt文件,我使用了这个命令[但是对于5.2MB的文件使用了
      -b5m
      ),它返回35个分割文件,所有这些文件都是txt文件和5.2MB,除了最后一个是5.0MB。现在,因为我希望我的行保持完整,所以我希望每100万行分割一次主文件,但是
      split
      命令甚至不允许我执行
      -100000
      操作,更不用说“
      -1000000
      ,所以在我的Linux系统(Red Hat Enterprise 6.9)上,要分割的大量行将无法工作。

      中,
      split
      命令没有用于
      -n
      --附加后缀的命令行选项

      相反,我用了这个:

      split -d -l NUM_LINES really_big_file.txt split_files.txt.
      
      其中,
      -d
      是在
      split_files.txt的末尾添加一个数字后缀。
      -l
      指定每个文件的行数

      $ 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
      
      例如,假设我有一个非常大的文件,如下所示:

      awk -vc=1 'NR%1000000==0{++c}{print $0 > c".txt"}' Datafile.txt
      
      for filename in *.txt; do mv "$filename" "Prefix_$filename"; done;
      
      $ 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
      
      此文件有100000行,我想将其拆分为最多30000行的文件。此命令将运行拆分并在输出文件模式的末尾追加一个整数
      split\u files.txt.

      $ split -d -l 30000 really_big_file.txt split_files.txt.
      
      结果文件被正确分割,每个文件最多30000行

      $ 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
      

      如果每个零件都有相同的行号,例如22,这里是我的解决方案:
      split——数字后缀=2——附加后缀=.txt-l22 file.txt文件

      在前22行中获取file2.txt,在下22行中获取file3.txt


      谢谢@hamruta takawale,@dror-s和@stackoverflowuser2010

      split
      可以做到这一点too@JohnSmith是的,我们没有很快看到这个选项。@JohnSmith我收回了它。我们如何确保行是均匀的?当然,不使用
      wc-l
      并计算它,否则我们可以使用bash本身或awk。这是事实这是我编写脚本而没有考虑拆分的原因。你能不能通过使用<代码>拆分
      来更新文件的数量,而不必分割它的线?你可以使用<代码> WC-L/CODE >获取总的线条并运行这样的代码<代码> A=(<代码> WC-L YouFrase>代码>);lines=
      echo$a/12 | bc-l`;split-l=$lines-d file.txt file`所有这些复杂的东西,你只要使用awk就可以了。这对不允许读取两次数据的非文件输入不起作用。只是说你之前声称的
      split
      可以做到这一点并不正确。正如预期的那样,你使用了
      wc
      。很好的更新,我个人很高兴您没有使用awk,因为行计数可以在不读取完整文件的情况下实现。通过此逻辑,您还可以
      a=(`wc-cyourfile`);n=12;bytes=`echo(a-a%n)/n`|bc-l`;split-b=$bytes-d file.txt文件
      ,如果不使用可除数,则以最后一个文件作为尾随字节进行平均分割。方法的导数似乎很容易调整!或者只需使用split-nl/12 file.txt获得12个文件,按行分割不会创建
      system\u split.log1
      system\u split.log2
      ,等等,没有
      附加后缀
      选项?是的,它会这样做。它如何选择aa、ab、ac…?@T.BrianJones它由split个人负责,我更喜欢使用
      -d
      使split使用数字后缀。有没有办法知道已经创建了多少个文件?我不是说手动计算,我是说command split output TH或是否有命令行参数告诉它输出该命令行?要查找行数do
      wc-l
      ,只需使用
      split
      -C
      选项。这非常有用
      --附加后缀=.txt