【问题标题】:Extracting n rows of text from a large csv file从大型 csv 文件中提取 n 行文本
【发布时间】:2011-03-29 01:00:44
【问题描述】:

我有一个包含 200,000 行的 CSV 文件 (foo.csv)。我需要将它分成四个文件(foo1.csv、foo2.csv...等),每个文件有 50,000 行。

我已经使用 gui 文本编辑器尝试了简单的 ctrl-v/-c,但是我的计算机速度变慢了。

我可以使用哪些 unix 命令来完成这项任务?

【问题讨论】:

    标签: grep unix


    【解决方案1】:

    我为this topic 编写的这个小shell 脚本与你的非常相似。

    这个 shell 脚本 + awk 对我来说很好用:

    #!/bin/bash
    awk -v initial_line=$1 -v end_line=$2 '{
        if (NR >= initial_line && NR <= end_line) 
        print $0
    }' $3
    

    与此示例文件 (file.txt) 一起使用:

    one
    two
    three
    four
    five
    six
    

    命令(从文件的第二行到第四行提取):

    edu@debian5:~$./script.sh 2 4 file.txt
    

    此命令的输出:

    two
    three
    four
    

    当然,您可以改进它,例如通过测试所有参数值是否符合预期:-)

    【讨论】:

      【解决方案2】:

      您可以使用sed

      【讨论】:

        【解决方案3】:

        拆分-l50000 foo.csv

        【讨论】:

          【解决方案4】:

          您应该使用headtail

          head -n 50000 myfile > part1.csv
          head -n 100000 myfile | tail -n 50000 > part2.csv 
          head -n 150000 myfile | tail -n 50000 > part3.csv 
          

          等等……

          否则,但无法控制文件名,您可以使用 unix 命令split

          【讨论】:

            【解决方案5】:

            我没有方便的终端来试用它,但它应该只是split -d -l 50000 foo.csv

            希望命名不是很重要,因为使用-d 选项,输出文件将命名为foo.csv00 .. foo.csv03。您可以添加 -a 1 选项,使后缀为 0-3,但没有简单的方法可以将后缀注入文件名的中间。

            【讨论】:

              【解决方案6】:
              sed -n 2000,4000p somefile.txt
              

              将从第 2000 行到第 4000 行打印到标准输出。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-01-21
                • 1970-01-01
                • 1970-01-01
                • 2017-06-23
                • 1970-01-01
                相关资源
                最近更新 更多