【问题标题】:How can I split one text file into multiple *.txt files?如何将一个文本文件拆分为多个 *.txt 文件?
【发布时间】:2021-08-20 11:56:15
【问题描述】:

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

something1
something2
something3
something4
(...)

有没有办法将file.txt 拆分为 12 个 *.txt 文件,比如file2.txtfile3.txtfile4.txt 等?

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    您可以使用 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/Nr/Nr/k/N

    【讨论】:

    • 您能否更新一下如何确保文件数量均匀而无需仅使用split 拆分其中的行?
    • 您可以使用wc -l 获取总行数并运行类似a=(wc -l yourfile) ; lines=echo $a/12 |公元前-l`;拆分 -l=$lines -d file.txt 文件`
    • 鉴于所有这些复杂性,您可以只使用 awk。这不适用于不允许两次读取数据的非文件输入。只是说您之前声称split 可以做到这一点并不正确。正如预期的那样,您使用了wc
    • 不错的更新,个人很高兴您没有使用 awk,因为无需读取完整文件即可实现行数。通过这种逻辑,如果您不使用可整除的数字,您还可以a=(`wc -c yourfile`) ; n=12; bytes=`echo (a-a%n)/n` | bc -l` ; split -b=$bytes -d file.txt file 并以最后一个文件作为尾随字节均匀分割。您方法的导数似乎很容易调整!
    • 或者直接使用 split -n l/12 file.txt 得到12个文件,按行分割
    【解决方案2】:
    $ split -l 100 input_file output_file
    

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

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

    【讨论】:

    • 如何选择aa、ab、ac...?
    • @T.BrianJones 由拆分处理
    • 就个人而言,我更喜欢使用-d 来拆分使用数字后缀。
    • 有没有办法知道创建了多少文件?我的意思不是手动计算它们,我的意思是命令拆分输出还是有命令行参数告诉它输出?
    • 要查找行数做wc -l <filename>
    【解决方案3】:

    CS Pei 的答案不会像 OP 所希望的那样生成 .txt 文件。使用:

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

    【讨论】:

    • 这很有帮助--additional-suffix=.txt
    • 这里没有一个叫“约翰”的人。它指的是什么答案?
    • 好问题。一定是CS裴。将编辑。
    • 我不知道-b=1M 选项适用于哪个操作系统。但在 Ubuntu 和 Centos 上,选项 -b=1M 会报错“split: =1M: invalid number of bytes”。正确的选项是-b 1M--bytes=1M。短选项需要空格。
    【解决方案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不同,这个确保行数最均匀。

    【讨论】:

    • split 也可以这样做
    • @JohnSmith 是的,没很快看到这个选项。
    • @JohnSmith 我收回了。我们如何确保线条是均匀的?当然不使用wc -l 并计算它,否则我们可以只使用bash 本身或awk。而这其实也是我制作剧本并没有考虑拆分的原因。
    【解决方案5】:

    不管之前的回答中说了什么,在我的 Ubuntu 16.04 (Xenial Xerus) 上我必须这样做:

    split -b 10M -d  system.log system_split.log
    

    请注意-b 和值之间的空格

    【讨论】:

    • 如果没有 additional-suffix 选项,会不会创建 system_split.log1system_split.log2 等?
    • 是的,它会这样做
    【解决方案6】:

    我同意@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选项。
    【解决方案7】:

    试试这样的:

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

    【讨论】:

      【解决方案8】:

      在我的 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
      

      【讨论】:

        【解决方案9】:

        如果每个部分的行数相同,例如22行,这是我的解决方案:

        split --numeric-suffixes=2 --additional-suffix=.txt -l 22 file.txt file
        

        你得到 file2.txt 的前 22 行,file3.txt 的 22 下一行,等等。

        感谢@hamruta-takawale、@dror-s 和 @stackoverflowuser2010

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-08
          • 1970-01-01
          • 1970-01-01
          • 2013-04-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多