【问题标题】:Split Command - Choose Output Name拆分命令 - 选择输出名称
【发布时间】:2014-11-03 20:44:11
【问题描述】:

我有一个名为myfile.txt 的文本文件。该文件包含 50,000 行,我想将其拆分为 50 个文本文件。我知道使用 split 命令很容易:

split myfile.txt

这将输出 50 个 1000 行的文件:xaa、xab 和 xac。

我的问题,我如何运行拆分我的文本文件,以便它命名输出文件:

1.txt 
2.txt
3.txt

...

50.txt

请在 python 或 bash 中寻求答案。谢谢!

【问题讨论】:

    标签: python bash split


    【解决方案1】:

    这是一个潜在的解决方案,使用itertools.islice 来获取不同文件名的块和字符串格式:

    from itertools import islice
    
    with open('myfile.txt') as in_file:
        for i in range(1, 51):
            with open('{0}.txt'.format(i), 'w') as out_file:
                 lines = islice(in_file, 1000)
                 out_file.writelines(lines)
    

    【讨论】:

      【解决方案2】:

      它并不完全是您正在寻找的东西,而是正在运行

      split -d myfile.txt
      

      会输出

      x00
      x01
      x02
      ...
      

      【讨论】:

        【解决方案3】:

        要在空目录中生成测试数据,可以使用

        seq 50000 | split -d
        

        要以您想要的方式重命名,您可以使用

        ls x* | awk '{print  $0, (substr($0,2)+1) ".txt"}' | xargs -n2 mv
        

        【讨论】:

          【解决方案4】:

          这里有一个有趣的:如果你的split 命令支持--filter 选项,你可以使用它!

          如果你打电话

          split --filter=./banana myfile.txt
          

          然后将执行命令./banana,并将环境变量FILE 设置为名称split 将选择写入它正在处理的块。该命令将在其标准输入上接收正在处理的块。如果此命令返回非零状态码,则 split 将中断其操作。

          加上-d 选项,这正是您想要的。使用-d 选项,名称拆分将为文件名选择x01x02 等。

          制作脚本:

          #!/bin/bash
          
          # remove the leading x from FILE
          n=${FILE#x}
          # check that n is a number
          [[ $n = +([[:digit:]]) ]] || exit 1
          # remove the leading zeroes from n
          n=$((10#$n))
          
          # send stdin to file
          cat > "$n.txt"
          

          调用这个脚本bananachmod +x,我们开始吧:

          split -d --filter=./banana myfile.txt
          

          --filter 这个选项真的很有趣。

          【讨论】:

          • 什么版本支持--filter? Mac OS X 10.10 中包含的 BSD split 或 GNU coreutils 8.4 中包含的 GNU split 似乎都不支持它。
          • @chepner split (GNU coreutils) 8.21。我刚刚通过阅读man 页面发现了这个时髦的选项。绝招。
          【解决方案5】:

          以下是如何在 bash 中拆分此文件的示例:

          split -l 1000 -d --additional-suffix=.txt myfile.txt
          

          -l 参数确定每个拆分文件中包含的行数(在这种情况下为 1000 行,总共 50 个文件),-d 参数使用数字而不是字母作为后缀,以及我们传递给的值这里的--additional-suffix 参数为每​​个文件提供了.txt 文件扩展名。

          这将创建

          x00.txt
          x01.txt
          x01.txt
          

          等等

          如果您想更改输出文件的“x”部分,您需要在输入文件之后添加前缀(例如,myfile.txt f 将创建 f01.txtf02.txt 等)

          请注意,如果没有--additional-suffix,您的文件都将缺少文件扩展名。

          我已经查看是否有一种方法可以拆分文件并使用 后缀命名它们,但我没有找到任何东西。

          【讨论】:

            【解决方案6】:

            一个简单的方法:

            f=open('your_file')
            count_line,file = 0,1
            for x in f:
                count_line +=1
                if count%1000 == 1:
                    f1 = open(str(file) + '.txt','w')
                    f1.write(x)
                    file +=1
                elif count_line%1000 == 0:
                    f1.write(x)
                    f1.close()
                else:f1.write(x)
            

            【讨论】:

            • 不是我的反对意见,但无论这是否有效,这确实是写得很糟糕的代码。
            猜你喜欢
            • 2019-01-24
            • 1970-01-01
            • 2010-12-10
            • 2013-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多